从 Camel 连接到 JBoss EAP6 上的队列

Posted

技术标签:

【中文标题】从 Camel 连接到 JBoss EAP6 上的队列【英文标题】:Connect to a queue on JBoss EAP6 from Camel 【发布时间】:2020-01-20 15:48:48 【问题描述】:

我在 JBoss EAP6 上的 Standalone.xml 文件中设置了 HornetQ JMS 队列。

<hornetq-server>
[...]
    <jms-connection-factories>
        <connection-factory name="RemoteConnectionFactory">
            <connectors>
                <connector-ref connector-name="netty"/>
            </connectors>
            <entries>
                <entry name="java:jboss/exported/jms/RemoteConnectionFactory"/>
            </entries>
        </connection-factory>
    </jms-connection-factories>

    <jms-destinations>
        <jms-queue name="WorkflowExecution">
            <entry name="/queue/MyQueue"/>
            <entry name="java:jboss/exported/queue/MyQueue"/>
        </jms-queue>
    </jms-destinations>
</hornetq-server>

队列工作正常,我可以使用 Hermes JMS 等工具在其上发送消息。

我正在开发一个在 Fuse 4.4 中运行的独立客户端应用程序,它必须通过 Camel 路由向队列发送消息,但我不知道如何在配置中设置连接器。

这是我尝试在 camel-context.xml 文件中设置的内容:

<bean id="jmsinjection" class="org.apache.camel.component.jms.JmsComponent">
  <property name="connectionFactory">
    <bean class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName" value="jms/RemoteConnectionFactory" />
      <property name="jndiEnvironment">
        <props>
          <prop key="java.naming.provider.url">remote://myEAPurl:port</prop>
          <prop key="java.naming.factory.initial">org.jboss.naming.remote.client.InitialContextFactory</prop>
        </props>
      </property>
    </bean>
  </property>
</bean>

我得到的例外:

在 URL [bundle://79.37:0/META-INF/spring/camel-context.xml] 中定义名称为“jmsinjection”的 bean 创建错误:bean 初始化失败;嵌套异常是 org.springframework.beans.ConversionNotSupportedException:无法将类型“org.hornetq.jms.client.HornetQJMSConnectionFactory”的属性值转换为属性“connectionFactory”所需的类型“javax.jms.ConnectionFactory”;嵌套异常是 java.lang.IllegalStateException:无法将类型 [org.hornetq.jms.client.HornetQJMSConnectionFactory] ​​的值转换为属性“connectionFactory”所需的类型 [javax.jms.ConnectionFactory]:找不到匹配的编辑器或转换策略

根据 javadoc,HornetQJMSConnectionFactory 实现了 javax.jms.QueueConnectionFactory 扩展 javax.jms.ConnectionFactory,所以我不明白为什么会出现这个异常。

我花了几个小时爬取 JBoss 论坛和文档,但找不到让它工作的方法。

我的骆驼配置有什么问题?如何解决?

【问题讨论】:

你试过显式转换吗? @FranciscoMelojunior 你能解释一下吗? 【参考方案1】:

问题是由于 OSGi 类加载器造成的。

Fuse ESB 已经在类路径中加载了 javax.jms.ConnectionFactory 版本。

添加jboss-client.jar 确实会将HornetQJMSConnectionFactory 添加到类路径中,但也会添加另一个版本的ConnectionFactory

解决方案是将以下所有依赖项添加到包中并删除jboss-client.jar,如this page 所示:

hornetq-core
hornetq-jms
jboss-ejb-client
jboss-logging
jboss-logmanager
jboss-marshalling
jboss-marshalling-river
jboss-remote-naming
jboss-remoting
jboss-sasl
netty
remoting-jmx
xnio-api
xnio-nio

您可以直接在您的 JBoss EAP 实例存储库中找到所有具有正确版本的依赖项。名字可能有点不同。

【讨论】:

以上是关于从 Camel 连接到 JBoss EAP6 上的队列的主要内容,如果未能解决你的问题,请参考以下文章

在 VirtualBox 中连接到 Oracle Linux 7 上的 JBoss AS 7

jboss eap6.1(ejb升级)

jboss eap6.1(部署应用)

Apache Camel - 连接到 Gtalk

是否有任何选项可以连接到 Azure Tables 以从 Camel 存储和检索数据?

JBoss cli 连接到 docker