Настройка моста ActiveMQ для подключения к различным реализациям MOM
Я хотел бы развернуть ActiveMQ для подключения и взаимодействия с другими реализациями MOM jms, такими как WebsphereMQ, Tibco EMS, Oracle WebLogic JMS и т. Д.
Насколько я исследовал в сети, это представляется возможным путем создания так называемого моста поверх activemq, который сможет обмениваться данными с другим концом, независимо от базового проводного протокола, используемого каждой реализацией jms.
Хотя примеров немного, и зачастую они минимальны, и поэтому возникает путаница в том, нужно ли мне включать jar-клиент jms из каждой такой реализации (Weblogic, WebsphereMQ, TIBCO EMS и т. Д.) В мою конфигурацию classpath и моста. Можно ли это сделать без таких банок?
Поскольку цель состоит в том, чтобы подключиться к отдельным организациям MOM, я бы хотел избежать использования любых сторонних, потенциально лицензированных, jar.
3 ответа
... вопрос о том, нужно ли мне включать JAR-клиент JMS от каждой такой реализации (Weblogic, Websphere MQ, TIBCO EMS и т. д.) в мою конфигурацию classpath и моста. Можно ли это сделать без таких банок?
TL; DR: вам нужны проприетарные классы производителя.
JMS определяет API и оставляет формат передачи и другие подробности реализации поставщику транспорта. Кроме того, в проприетарных реализациях форматы проводов могут значительно меняться от версии к версии. (Одним из преимуществ проприетарного кода является возможность вносить такие большие структурные изменения, когда это повышает производительность, надежность или функционирование.)
Единственное место, где две реализации JMS имеют общность, - это когда сообщения находятся в памяти. Поскольку все реализации поставщика транспорта наследуются от одних и тех же классов JMS Java, обычно можно создавать экземпляры объектов сообщений от двух разных поставщиков транспорта и копировать их из одного в другой. Для этого у вас должны быть банки каждого поддерживаемого транспортного провайдера.
Фактически, именно так работают большинство продуктов JMS-мостов, которые я использовал. Код моста использует полные имена классов для ссылки на классы двух разных поставщиков. Затем создаются две фабрики соединений, по одной для каждого транспорта, и два разных пункта назначения, также по одному для каждого транспорта. Затем он читает сообщение из очереди одного поставщика, копирует его в объект сообщения другого поставщика транспорта, а затем записывает сообщение.
Конечно, есть много "ошибок" с таким подходом. Я перечислю несколько из очевидных:
- Картирование направлений между поставщиками выполняется вручную.
- Распространение идентификационных данных не подлежит принудительному исполнению и требует, чтобы мост имел квази- или полные права администратора.
- Транзакционность между провайдерами в лучшем случае трудна, в худшем - невозможна.
- Идентификаторы корреляции должны отображаться мостом, если они отображаются вообще. Это делает мост более сложным и требует от него использования базы данных или другого постоянного хранилища.
- Специфичные для поставщика классы часто имеют расширенный набор атрибутов и методов, указанных в спецификации JMS. Если они используются, они удаляются во время копирования.
- Из-за сегментации сообщений, группировки и других сходств корреляция 1:1 по мосту может отсутствовать.
- Из-за различий в реализации таких вещей, как высокая доступность, структура физической сети одного транспортного провайдера может не соответствовать 1:1 структуре другого транспортного провайдера. Это имеет тенденцию ограничивать функцию моста самым простым общим знаменателем двух транспортов.
- Проблемы, поднятые мостом общего назначения, включают в себя все проблемы двухстороннего моста, поднятые как показатель числа поддерживаемых транспортов. Так что если 2-транспортный мост затруднен
x
затем для целей планирования предположим, что 5 транспортных мостов затруднены(x)**5
,
Это не значит "не кодировать мост", поскольку они оказываются очень полезными. Просто знайте, это не тривиальная задача.
Боюсь, что это невозможно, по крайней мере, на стороне IBM MQ. JMS - это просто API, и каждый провайдер может реализовать его так, как он считает нужным (как вы правильно сказали, это не проводной протокол). Банки поставщика необходимы для подключения к продукту JMS.
У нас есть концепция под названием Виртуальные направления, попробуйте