Доступ к OpenMQ JMS Broker из ServiceMix+Camel
Я пытаюсь заставить ServiceMix+Camel общаться с OpenMQ JMS Broker. У меня есть определение маршрута Camel, определенное в Blueprint DSL, который отправляет сообщения в очередь ActiveMQ JMS. Это работает нормально, но сейчас я пытаюсь преобразовать это для отправки сообщений в экземпляр OpenMQ, работающий внутри контейнера Glassfish4.
Я использую следующую конфигурацию: JDK 1.7.0_60 ServiceMix 5.1.1 (верблюд 2.13.2)
Документация по этой теме несколько минимальна, но я собрал различные фрагменты из поисков Google здесь и здесь и придумаю следующее (только соответствующие части):
....
<!-- Post over JMS into Manager -->
<to uri="openmq:queue:resman"/>
</route>
</camelContext>
<bean id="openmq" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory">
<bean class="com.sun.messaging.ConnectionFactory">
<property name="imqAddressList" value="localhost:7676"/>
</bean>
</property>
</bean>
У меня в Servicemix/OSGI включены следующие "функции", связанные с JMS:
[installed ] [3.2.4.RELEASE ] spring-jms
[installed ] [2.13.2 ] camel-jms
и у меня установлены и активны следующие пакеты OSGI:
[ 89] [Active ] [ ] [ ] [ 50] geronimo-jms_1.1_spec (1.1.1)
[ 126] [Active ] [ ] [ ] [ 50] camel-jms (2.13.2)
У меня есть проблема ClassNotFoundException в момент, когда я внедряю проект Came Route Blueprint в ServiceMix. Вот соответствующие фрагменты из Stacktrace:
org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to instantiate components
Caused by: java.lang.NoClassDefFoundError: javax/jms/JMSContext
Caused by: java.lang.ClassNotFoundException: javax.jms.JMSContext not found by org.apache.geronimo.specs.geronimo-jms_1.1_spec [89]
Итак, исходя из предположения, что это проблема OSGI, я углубился в "особенности" Camel только для того, чтобы подтвердить зависимости:
karaf@root> features:info camel-jms
Description of camel-jms 2.13.2 feature
----------------------------------------------------------------
Feature has no configuration
Feature has no configuration files
Feature depends on:
spring [3.2,4)
spring-jms [3.2,4)
camel-core 2.13.2
Feature contains followed bundles:
mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/1.1.1 start-level=50
mvn:commons-pool/commons-pool/1.6 start-level=50
mvn:org.apache.geronimo.specs/geronimo-jms_1.1_spec/1.1.1 start-level=50
mvn:org.apache.camel/camel-jms/2.13.2 start-level=50
Таким образом, кажется, что именно "geronimo-jms_1.1_spec" вызывает трассировку стека, поскольку он не может найти JMSContext. Я сделал большое предположение, что, поскольку ApacheMQ должен использовать тот же класс JMS, он должен быть где-то в среде. Кроме того, JMSContext представляется интерфейсом API JMS 2.0, поэтому проблема заключается в том, что пакет geronimo-jms_1.1_spec пытается ссылаться на API JMS2?
У меня также есть проблема получения клиентских JAR для OpenMQ, установленных в среде. JAR-файлы клиента OpenMQ, поставляемые с Glassfish4, являются обычными JAR-файлами, а не пакетами OSGI (см. https://java.net/jira/browse/MQ-328), поэтому я планирую использовать функцию "file:wrap" для ее развертывания в ServiceMix или распакуйте и распакуйте другим способом в JAR, содержащий мои Бины. Я не думаю, что это связано с этой проблемой, но я могу ошибаться.
1 ответ
ОК, наконец-то удалось разобраться с этим. Подсказка была в ссылке на javax.jms.JMSContext, который является новым в API JMS 2.0. Я пытался использовать клиентские библиотеки OpenMQ (imq.jar и jms.jar), взятые из дистрибутива Glassfish4, который находится в JEE7 и, следовательно, JMS v1.1. ServiceMix 5.1.1 все еще находится в JMS V1.1, следовательно, ClassNotFoundException.
Решение: при подключении к экземпляру OpenMQ, работающему под Glassfish4, вам необходимо загрузить и использовать клиентские библиотеки OpenMQ из предыдущего выпуска Glassfish 3.2.2. Вы можете получить этот релиз из архива проекта Glassfish здесь.
Пока что тесты показывают, что это работает нормально, поэтому, если я увижу что-то актуальное в будущем, я вернусь и обновлю этот пост.