Как я могу интегрировать свой собственный менеджер транзакций XA с Apache Camel?

Я пытаюсь создать маршрутизатор для интеграции нескольких тем и очередей JMS. Меня ограничивает тот факт, что клиент, на которого я работаю, не может изменить реализацию JMS (TibCo EMS с некоторыми пользовательскими клиентскими библиотеками), а также тот факт, что они написали свой собственный менеджер транзакций XA, который не совсем соответствует спецификации JTA. . Очень важно, чтобы доставка сообщения была гарантирована.

Я много читал и экспериментировал с Camel, и я понял, что мне, вероятно, нужно написать свой собственный компонент JMS, поскольку стандартный компонент JMS не собирается интегрироваться с клиентскими библиотеками JMS или TM, которые у меня есть.

Мне нужно иметь возможность добавлять крючки в жизненный цикл маршрута в следующих точках:

  • Во время запуска маршрута мне нужно идентифицировать все соединения JMS и задействовать их как ресурсы XA с реализацией TM.

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

  • Когда решение о маршрутизации принято, мне нужно отправить сообщение производителю и зафиксировать транзакцию.

Учитывая вышесказанное, я думаю, что могу реализовать очень упрощенную версию компонента camel-jms, которая удаляет все части Spring и содержит только самый минимум, необходимый для взаимодействия с моими библиотеками JMS.

Где лучше всего инициализировать менеджер транзакций? Я просматривал DefaultCamelContext, RoutePolicy и RouteContext, но не могу найти место, где разрешены и инициализированы все конечные точки.


person jamess    schedule 22.02.2016    source источник


Ответы (1)


Я решил эту проблему, внедрив интерфейсы UserTransaction и TransactionManager и создав PlatformTransactionManager, который компонент Camel JMS использует для создания DefaultMessageListenerContainer.

Важно отметить, что свойство transacted в Camel JMSComponent относится к локальным транзакциям, а не к транзакциям XA. Если вы установите для этого свойства значение true после передачи PlatformTransactionManager компоненту, DMLC фактически попытается зафиксировать вашу транзакцию дважды, что не сработает.

Это оставляет мне хороший рабочий пример, использующий от одного JMS-брокера и производящий для другого, но он очень медленный — ~ 5 сообщений в секунду. К сожалению, Spring JMS не поддерживает пакетную обработку, поэтому кажется, что лучшим решением здесь является настройка конфигураций тем JMS таким образом, чтобы маршрутизация происходила только между темами одного и того же брокера.

person jamess    schedule 30.04.2016
comment
не могли бы вы привести пример? - person Oli; 13.11.2018