Конечные точки и транзакции прослушивателя Spring JMS

Когда я регистрирую конечные точки слушателя JMS программно, у меня больше нет поддержки транзакций.

Я использую TransactionAwareConnectionFactoryProxy с источником данных JDBC и JMS, который дает хорошие глобальные транзакции, как JTA (1PC global 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 ответ

Решение

Вы создаете Consumer вручную, чтобы объект вообще не был управляемым компонентом. Нет никаких причин (и на самом деле нет способа) для контекста приложения обработать этот класс и создать для него прокси.

Что бы ни создавало прослушиватель сообщений, он должен использовать управляемый компонент. Учитывая код, который вы предоставили, трудно понять, почему вам нужно пройти программную регистрацию, но это совсем другая тема.

Другие вопросы по тегам