2017-06-16 72 views
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()调用生成的代理。

任何想法如何以简单的方式做到这一点?

回答

0

您正在手动创建Consumer,因此对象根本不是托管bean。没有理由(也没有办法)让应用程序上下文处理该类并为其创建代理。

无论创建消息侦听器应该采用托管bean。根据你提供的代码,很难理解你为什么需要进行程序注册,但这是一个完全不同的主题。

+0

谢谢,这解决了我的问题。 – dvaneynde

+0

至于为什么,我可以用条件的东西做到这一点,我猜。但是我也很想理解这一点,因为你在使用JDBC和JMS的时候放置了Transactional,它看起来可以工作,但是你没有全局的tx。一个真的需要测试失败情况,看它是否有效。在非JEE环境中。 – dvaneynde