在WAS运行Java程序发送IBM MQ消息报类转换不兼容错误如何解决
问题原因分析
该类转换异常的核心根因是JNDI查询返回的连接工厂实例类型和代码中强转的类型不匹配:
- 你在WebSphere Application Server(WAS)控制台中配置的是通用JMS连接工厂(JMS Connection Factory),并非专有的队列连接工厂(Queue Connection Factory),因此lookup返回的
JMSConnectionFactoryHandle实例仅实现了javax.jms.ConnectionFactory接口,不是QueueConnectionFactory的子类,强制类型转换就会触发报错。 - 额外可能的触发原因:项目打包时内置了多余的JMS API Jar包,和WAS本身提供的JMS实现类产生类加载冲突,两个同名接口被不同类加载器加载也会触发类型不匹配错误。
解决方案
可任选以下一种方案解决问题:
方案1:修改代码使用通用JMS API(推荐,符合JMS 2.0规范,兼容性更强)
将代码中专属队列的JMS类型替换为通用JMS接口,修改后的代码如下:
public void putMessageViaCF3(String messageContent, String connectionFactory, String sendQName) throws MQException, IOException, NamingException, JMSException { Queue myQueue; // 替换为通用ConnectionFactory类型 ConnectionFactory myFactory; Connection connection = null; Session session = null; try { InitialContext jndi = new InitialContext(); // 不再强转为QueueConnectionFactory myFactory = (ConnectionFactory) jndi.lookup("jms/SORC_QM_CF"); myQueue = (Queue) jndi.lookup("jms/SORC_SEND_Q"); connection = myFactory.createConnection(); // 使用通用createSession方法,参数逻辑和原有createQueueSession完全一致 session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); // 用通用MessageProducer替代QueueSender MessageProducer producer = session.createProducer(myQueue); connection.start(); TextMessage textMessage = session.createTextMessage("Test Harish"); textMessage.setStringProperty("messageType", "file"); producer.send(textMessage); producer.close(); } finally { if (session != null) { session.close(); } if (connection != null) { connection.close(); } } }
方案2:修改WAS配置适配现有代码
如果不需要调整代码,直接修改WAS的JMS资源配置即可:
- 登录WAS管理控制台,进入
资源 > JMS > 队列连接工厂,删除之前配置的通用JMS连接工厂,重新创建队列连接工厂类型的资源,JNDI名称保持jms/SORC_QM_CF不变 - 保存配置后重启应用或WAS节点即可生效
额外检查项
如果调整后仍报错,请检查以下两点:
- 确认应用的
WEB-INF/lib、EAR/lib目录下没有打包javax.jms-api.jar、geronimo-jms.jar这类第三方JMS API包,WAS本身会自带JMS规范实现包,应用额外打包会导致类加载冲突 - 确认WAS上配置的MQ资源提供程序为IBM MQ官方版本,和应用依赖的MQ客户端版本兼容
内容的提问来源于stack exchange,提问作者Harishfysx
相关产品推荐
相关产品推荐

