0
当我以编程方式注册JMS侦听器端点时,我再也没有事务性支持。Spring JMS编程侦听器端点和事务
我使用TransactionAwareConnectionFactoryProxy与JDBC数据源和JMS,它提供像JTA一样好的全局事务(1PC全局tx)。使用注释,它工作得很好:
@JmsListener(containerFactory = "jmsQueueListenerContainerFactory", destination = "queue/exampleQueue")
@Transactional
public void onQueueMessage(Message message, Session session) {...}
但与编程端点注册它不起作用。端点注册代码:
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
registrar.setContainerFactory(jmsListenerContainerFactory());
SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId("Oelieboeliwieli");
endpoint.setDestination("queue/exampleQueue");
endpoint.setMessageListener(new Consumer());
registrar.registerEndpoint(endpoint);
}
与听者就是:
@Transactional
public void onMessage(Message message) { ... }
其他的都是在两种情况下是相同的。我的猜测是,没有为处理全局事务的onMessage()
方法生成代理。通过注释的解决方案,我可以看到从invokeWithinTransaction()
调用生成的代理。
任何想法如何以简单的方式做到这一点?
谢谢,这解决了我的问题。 – dvaneynde
至于为什么,我可以用条件的东西做到这一点,我猜。但是我也很想理解这一点,因为你在使用JDBC和JMS的时候放置了Transactional,它看起来可以工作,但是你没有全局的tx。一个真的需要测试失败情况,看它是否有效。在非JEE环境中。 – dvaneynde