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的类加载来源
- 调整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>
- 检查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
相关产品推荐
相关产品推荐

