gpt4 book ai didi

Groovy 闭包执行异常

转载 作者:行者123 更新时间:2023-12-01 15:03:33 25 4
gpt4 key购买 nike

我有一个主要使用 JMS 消息的类,然后继续使用这些消息调用闭包。消息监听器在单独的线程中运行。

import groovy.util.logging.Slf4j
import javax.jms.*

@Slf4j
class JMSProducer {

Connection connection
List<Queue> queues
private Session session
private List<MessageConsumer> messageConsumers

@Override
void init() {
connection.start()
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)
messageConsumers = queues.collect { session.createConsumer(it) }
}

@Override
void produce(final Closure closure) {

def listener = new MessageListener() {
@Override
void onMessage(Message message) {
if (message instanceof ObjectMessage) {
try {
log.info("Calling");
closure.call(message.object);
log.info("Called");
} catch(e) {
log.error("Error")
} finally {
log.info("Finally");
}
} else {
log.error("Unrecognized message")
}
}
}
messageConsumers.each {
it.messageListener = listener
}
}
}

上面代码的问题是,对于我放入队列的所有消息,我看到“正在调用”、“已调用”和“最终”,但闭包本身只调用了其中的一小部分。

//Assume 5 messages have been put into queue, and 
// JMSProducer has been configured to read from queue*

new JMSProducer().produce { message ->
log.info("Received Message");
}

“Received Message”仅记录两次(即使我每次看到“Calling”/“Called”/“Finally”五次)。

这几乎就像闭包被忽略或跳过一样。

当我在我的 IDE 中运行它时,我没有这个问题,只有在运行时 ./gradlew clean test 来自命令行。

最终这似乎是一个竞争条件,但我看不到如何在闭包执行之前和之后记录日志,也看不到应该在闭包内部发生的日志记录。


作为更新,我添加了代码以在运行时注销闭包对象,我看到了以下输出(代码在调试中略有更改,但问题仍然存在):

2016-01-12 14:56:04 INFO  JMSProducer - Calling: StreamUtil$2@1edef6f9
2016-01-12 14:56:04 INFO JMSProducer - Calling:JMSProducerTest$_verifyJMSProducer_closure1@fa11e9d
2016-01-12 14:56:04 INFO JMSProducer - Called
2016-01-12 14:56:04 INFO JMSProducer - Finally
2016-01-12 14:56:04 INFO JMSProducer - Called
2016-01-12 14:56:04 INFO JMSProducer - Finally
2016-01-12 14:56:04 INFO JMSProducer - Calling: StreamUtil$2@1edef6f9
2016-01-12 14:56:04 INFO JMSProducer - Calling: JMSProducerTest$_verifyJMSProducer_closure1@fa11e9d
2016-01-12 14:56:04 INFO JMSProducer - Called
2016-01-12 14:56:04 INFO JMSProducer - Finally
2016-01-12 14:56:04 INFO JMSProducer - Called
2016-01-12 14:56:04 INFO JMSProducer - Finally
2016-01-12 14:56:04 INFO JMSProducer - Calling: JMSProducerTest$_verifyJMSProducer_closure1@fa11e9d
2016-01-12 14:56:04 INFO JMSProducer - Called
2016-01-12 14:56:04 INFO JMSProducer - Finally

看起来回调始终不是一回事。只有当我得到 StreamUtil$2@1edef6f9 时,回调才会执行。

最佳答案

好吧,显然 JMS 中存在竞争条件,之前的测试以某种方式能够覆盖消息监听器(但仅针对迭代的一部分)。不完全确定这是如何发生的,但与异步测试和 JUnit 有关。

关于Groovy 闭包执行异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34734340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com