为什么MDB使用者再次从ActiveMQ接收消息



我有一个设置为的MDB使用者

@MessageDriven(name = "PackageReceiver", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup",
propertyValue = "myQueue"),
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode",
propertyValue = "Auto-acknowledge")
})

消息处理过程可能持续几秒钟到几个小时。

我知道触发了某种超时,在此期间没有对代理的确认(没有事务提交(

此外,我知道MDB只有两种确认模式:自动确认重复确认

默认情况下,MDB的onMessage()方法在JTA事务的上下文中执行。在这种情况下,acknowledgeMode被忽略。只有在提交JTA事务时才确认消息(当onMessage()返回时隐式完成,或者可以使用javax.ejb.EJBContext.getUserTransaction()显式完成(。

可能发生的情况是,当MDB花费很长时间时,JTA事务会超时并回滚,从而导致消息返回队列并重新传递。

要解决此问题,您可以延长事务超时(这取决于您的应用程序服务器(或禁用onMessage()上的JTA事务(例如使用@javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.NOT_SUPPORTED(。长时间运行的事务通常被认为是一种反模式,因此我建议不要延长超时时间。但是,如果您在onMessage()中使用任何其他事务资源(例如JDBC、JMS等(,那么禁用JTA事务可能会损害数据的完整性。最终,如何进行将取决于您的具体用例。

最新更新