Доступ к 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 здесь.

Пока что тесты показывают, что это работает нормально, поэтому, если я увижу что-то актуальное в будущем, я вернусь и обновлю этот пост.

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