JmsListener事务超时问题:如何自定义事务超时时间?
问题解答
你的理解是否正确?
完全正确。Spring的JMS监听器容器(如DefaultMessageListenerContainer)会在读取消息前就启动事务,随后才调用@JmsListener标注的方法。此时方法上的@Transactional会加入这个已存在的事务,而非创建新事务,因此你设置的10分钟超时不会生效,实际使用的是容器启动事务时的配置(即JBoss全局的5分钟事务超时)。
如何控制事务超时?
你需要在DefaultJmsListenerContainerFactory中配置事务属性,直接指定容器启动事务时的超时时间,具体代码如下:
@Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) throws NamingException { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); configurer.configure(factory, connectionFactory); // 配置事务属性,设置超时时间(单位:秒,600秒=10分钟) DefaultTransactionAttribute txAttr = new DefaultTransactionAttribute(); txAttr.setTimeout(600); // 保持事务传播行为为默认的REQUIRED txAttr.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); factory.setTransactionAttribute(txAttr); return factory; }
额外注意事项
如果JBoss服务器配置了全局事务超时,需要确保全局超时值不小于你设置的容器超时时间,否则服务器的全局配置会优先生效,导致你的超时设置被覆盖。
内容的提问来源于stack exchange,提问作者Todd Johnson
相关产品推荐
相关产品推荐

