首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ServiceMix+Camel访问OpenMQ JMS Broker

从ServiceMix+Camel访问OpenMQ JMS Broker
EN

Stack Overflow用户
提问于 2014-07-31 16:05:19
回答 1查看 1.2K关注 0票数 1

我正在尝试让ServiceMix+Camel与OpenMQ JMS Broker对话。我在Blueprint DSL中定义了一个Camel路由定义,它将消息发布到一个ActiveMQ JMS队列中。这可以很好地工作,但我现在正在尝试将其转换为post消息到在Glassfish4容器中运行的OpenMQ实例。

我正在运行以下配置: JDK 1.7.0_60 ServiceMix 5.1.1 (因此Camel2.13.2)

关于这个主题的文档有点少,但我已经从谷歌搜索herehere收集了各种代码片段,并提出了以下内容(仅限相关部分):

代码语言:javascript
复制
....
  <!-- 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相关的“特性”:

代码语言:javascript
复制
[installed  ] [3.2.4.RELEASE  ] spring-jms
[installed  ] [2.13.2         ] camel-jms

我已经安装并激活了以下OSGI包:

代码语言:javascript
复制
[  89] [Active     ] [            ] [       ] [   50] geronimo-jms_1.1_spec (1.1.1)
[ 126] [Active     ] [            ] [       ] [   50] camel-jms (2.13.2)

我遇到的问题是,在我将Came路由蓝图部署到ServiceMix中时,出现了一个ClassNotFoundException。下面是Stacktrace日志中的相关片段:

代码语言:javascript
复制
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的“特性”,只是为了确认依赖关系:

代码语言:javascript
复制
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-jms1.1spec”导致了堆栈跟踪,因为它找不到JMSContext。我做了一个很大的假设,因为ApacheMQ必须使用相同的JMS类,所以它一定在环境中的某个地方。另外,JMSContext似乎是一个JMS2.0API接口,那么geronimo- JMS _1.1spec捆绑包尝试引用JMS2 API是否存在问题呢?

我还遇到了将OpenMQ的客户端JAR安装到环境中的问题。Glassfish4附带的OpenMQ客户端JAR是普通的JAR,而不是OSGI (参见https://java.net/jira/browse/MQ-328),所以我计划要么使用“OpenMQ:wrap”特性将其部署到ServiceMix中,要么解压并重新打包到包含我的Beans的JAR中。我不认为这与这个问题有关,但我可能错了。

EN

回答 1

Stack Overflow用户

发布于 2014-08-02 04:43:42

好了,终于解决了这个问题。线索在对javax.jms.JMSContext的引用中,这是JMS2.0API中的新增内容。我尝试使用取自Glassfish4发行版的OpenMQ客户端库(imq.jar和jms.jar),该发行版位于JEE7,因此是JMSV1.1。JMS5.1.1仍然是JMSV1.1,因此才有了ClassNotFoundException。

解决方案:当连接到在Glassfish4下运行的OpenMQ实例时,您需要下载并使用以前Glassfish 3.2.2版本中的OpenMQ客户端库。您可以从Glassfish项目档案here获得此版本。

到目前为止,测试表明它工作得很好,所以如果我发现任何相关的东西,我会回来更新这篇文章。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25053755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档