当我以编程方式注册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 :(得分:0)
您正在手动创建Consumer
,因此对象根本不是托管bean。应用程序上下文没有理由(也没有办法)处理该类并为其创建代理。
无论创建什么,消息监听器都应该使用托管bean。鉴于您提供的代码,很难理解为什么您需要进行程序化注册,但这是一个完全不同的主题。