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 に再パックします。これはこの問題に関連しているとは思いませんが、間違っている可能性があります。