Spring JMS程序化侦听器端点和事务

时间:2017-06-16 13:20:11

标签: spring-jms

当我以编程方式注册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()调用的代理生成。

知道如何以简单的方式做到这一点吗?

1 个答案:

答案 0 :(得分:0)

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

无论创建什么,消息监听器都应该使用托管bean。鉴于您提供的代码,很难理解为什么您需要进行程序化注册,但这是一个完全不同的主题。