提问人:canEE 提问时间:11/16/2023 最后编辑:canEE 更新时间:11/16/2023 访问量:27
WildFly MDB 在正常关闭启动后继续使用消息
WildFly MDB continues to consume messages after graceful shutdown has initiated
问:
当我正常关闭 WildFly 时,我的 MDB 会继续使用 ActiveMQ 队列中的消息。然后线程将因 WildFly 抛出的异常而死亡。我们目前的解决方法是在触发 WildFly 关闭之前手动暂停 MDB。
我有以下 MDB 正在使用 ActiveMQ 队列中的消息:
@ResourceAdapter("activemq")
@MessageDriven(name = "MyMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "my_queue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")
})
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@Pool(value = "my-pool")
public class MyMDB implements MessageListener {
@Override
public void onMessage(final Message message) {
...
}
@PreDestroy
public void shutdown() {
LOG.info("Shutting down MyMDB");
}
}
我在 ActiveMQ 队列上有 1000 条消息,并使用 jboss-cli 的优雅命令触发 WildFly 关闭。
command=:shutdown(timeout=120)
注意:在 WildFly EJB 子模块中启用 Graceful Txn Shutdown
已启用
然后,WildFly 将开始喷出以下异常,直到 ActiveMQ 队列为空或达到 120 秒的超时。
AMQ154004: Failed to deliver message: org.jboss.as.ejb3.component.EJBComponentUnavailableException: WFLYEJB0421: Invocation cannot proceed as component is shutting down
我还可以在日志中看到我的日志消息是在引发异常之前记录的,因为在 WildFly 中知道它应该关闭。Shutting down MyMDB
我怀疑 ActiveMQ 在从 WildFly 抛出异常时正在重新传递消息,因为我们收到此错误超过 1000 次。但最终,所有消息都将移动到 ActiveMQ 的 DLQ(死信队列)。
当我阅读 WildFly 中优雅关闭的文档时,我的理解是所有 MDB 都应该停止消费,但这似乎确实发生了。
正常关闭 WildFly 是否应该阻止 MDB 从 ActiveMQ 使用?如果应该,有没有想过为什么在我的情况下没有?
- WildFly 版本:16.0.0.Final
- ActiveMQ Artemis 版本:2.6.4
- Java 版本:8
答: 暂无答案
评论
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
enable-graceful-txn-shutdown
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)