1

ServiceMix+Camel を OpenMQ JMS ブローカーと通信させようとしています。メッセージを ActiveMQ JMS キューにポストする Blueprint DSL で定義された Camel ルート定義があります。これは正常に動作していますが、これを変換して、Glassfish4 コンテナー内で実行されている OpenMQ のインスタンスにメッセージを投稿しようとしています。

次の構成を実行しています: JDK 1.7.0_60 ServiceMix 5.1.1 (だから Camel 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)

問題は、Came Route ブループリントを ServiceMix にデプロイした時点で ClassNotFoundException が発生することです。ログに記録された 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

したがって、JMSContext が見つからないため、スタック トレースを引き起こしているのは「geronimo-jms_1.1_spec」であると思われます。私は、ApacheMQ が同じ JMS クラスを使用している必要があるため、環境のどこかにある必要があるという大きな仮定を立てています。また、JMSContext は JMS 2.0 API インターフェースのようですが、geronimo-jms_1.1_spec バンドルが JMS2 API を参照しようとしていることが問題なのでしょうか?

OpenMQ のクライアント JAR を環境にインストールするという問題もあります。Glassfish4 に同梱されている OpenMQ クライアント JAR はプレーン JAR であり、OSGI バンドル ( https://java.net/jira/browse/MQ-328を参照) ではないため、「file:wrap」機能を使用してこれをデプロイする予定ですServiceMix、または別の方法でアンパックして、Bean を含む JAR に再パックします。これはこの問題に関連しているとは思いませんが、間違っている可能性があります。

4

1 に答える 1