我有一个设置为的MDB使用者
@MessageDriven(name = "PackageReceiver", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup",
propertyValue = "myQueue"),
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode",
propertyValue = "Auto-acknowledge")
})
消息处理过程可能持续几秒钟到几个小时。
我知道触发了某种超时,在此期间没有对代理的确认(没有事务提交(
此外,我知道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事务可能会损害数据的完整性。最终,如何进行将取决于您的具体用例。