我正在尝试让 ServiceMix+Camel 与 OpenMQ JMS Broker 交谈。我在 Blueprint DSL 中定义了一个 Camel 路由定义,它将消息发布到 ActiveMQ JMS 队列中。这工作正常,但我现在尝试将其转换为将消息发布到在 Glassfish4 容器内运行的 OpenMQ 实例。
我正在运行以下配置:JDK 1.7.0_60 ServiceMix 5.1.1(所以 Camel 2.13.2)
关于这个主题的文档有点少,但我在这里和这里从谷歌搜索中收集了各种片段,并提出了以下内容(仅相关部分):
....
<!-- 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
因此,似乎是“geronimo-jms_1.1_spec”导致堆栈跟踪,因为它找不到 JMSContext。我做了一个很大的假设,因为 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 中。我不认为这与这个问题有关,但我可能是错的。