You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Camel连接JBoss EAP6的HornetQ JMS队列配置异常求助

解决Fuse 4.4 Camel客户端连接JBoss EAP 6 HornetQ JMS的类型转换异常

这个问题我之前在OSGi环境里也碰到过,核心是类加载器隔离机制在搞鬼!虽然org.hornetq.jms.client.HornetQJMSConnectionFactory确实实现了javax.jms.ConnectionFactory,但在Fuse 4.4的OSGi容器中,Camel组件依赖的javax.jms.ConnectionFactory类,和你从EAP远程JNDI拿到的实例所依赖的同名类,是由不同类加载器加载的——OSGi会把不同bundle加载的同全限定名类视为完全不同的类型,自然就转不动了。

下面给你几个可行的解决方案:

方案1:统一JMS API的类加载来源

  1. 调整Maven依赖范围:确保你的客户端bundle没有把JMS API打包进去,而是使用Fuse容器提供的版本。在pom.xml里把JMS API依赖设为provided:
<dependency>
    <groupId>javax.jms</groupId>
    <artifactId>jms-api</artifactId>
    <version>1.1</version>
    <scope>provided</scope>
</dependency>
  1. 检查MANIFEST.MF的包导入:确保你的bundle明确导入了javax.jms包,这样才会使用容器提供的类。如果用Maven Bundle插件,它会自动生成这个导入;如果是手动配置,要加上:
Import-Package: javax.jms;version="[1.1,2.0)"

方案2:直接实例化HornetQ远程连接工厂

绕过JNDI获取连接工厂的步骤,直接在Camel配置里创建HornetQ的远程连接实例,彻底避开跨类加载器的类型问题:
修改你的camel-context.xml:

<!-- 直接创建HornetQ远程连接工厂 -->
<bean id="hornetqConnectionFactory" class="org.hornetq.jms.client.HornetQJMSConnectionFactory">
    <!-- 第一个参数表示是否启用HA,这里设为false -->
    <constructor-arg name="ha" value="false"/>
    <constructor-arg>
        <bean class="org.hornetq.api.core.TransportConfiguration">
            <!-- 指定Netty连接器工厂 -->
            <constructor-arg value="org.hornetq.core.remoting.impl.netty.NettyConnectorFactory"/>
            <constructor-arg>
                <map>
                    <entry key="host" value="myEAPurl"/>
                    <entry key="port" value="port"/>
                </map>
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>

<!-- 配置Camel的JMS组件 -->
<bean id="jmsinjection" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory" ref="hornetqConnectionFactory"/>
    <!-- 如果EAP需要认证,添加用户名密码 -->
    <property name="username" value="your-username"/>
    <property name="password" value="your-password"/>
</bean>

方案3:确保Fuse容器有HornetQ客户端依赖

登录Fuse控制台,执行osgi:list命令,查看是否有org.hornetq相关的bundle在运行。如果没有,需要把HornetQ客户端的jar包(比如hornetq-jms-client.jar、hornetq-core-client.jar等)打包成OSGi bundle,部署到Fuse容器中,这样你的客户端bundle才能正确加载HornetQ的类。

调整完配置后,重启你的客户端bundle,再尝试发送消息到/queue/MyQueue,应该就能正常工作了。

内容的提问来源于stack exchange,提问作者jhamon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:59:45