如何使用JMS与IBM MQ收发消息及解决选择器语法错误异常
一、如何使用JMS向IBM MQ发送请求并接收响应?
- 配置IBM MQ连接工厂:实例化
MQConnectionFactory,设置MQ服务器主机地址、端口、队列管理器名称、通道名称等核心参数,配置用户名和密码完成认证。 - 建立JMS连接与会话:通过连接工厂创建
Connection并启动,基于连接创建Session,可根据需求选择事务模式(如SESSION_TRANSACTED)和消息确认模式(如AUTO_ACKNOWLEDGE)。 - 定义队列目标:创建
Queue对象,分别指定请求队列和响应队列的名称,作为消息收发的目标。 - 构造请求消息:创建
TextMessage或BytesMessage填充业务内容,设置JMSReplyTo属性为响应队列,确保响应能路由到指定队列;同时记录消息的JMSMessageID,用于后续关联响应。 - 发送请求:创建
MessageProducer,将构造好的请求消息发送至请求队列。 - 接收响应:创建
MessageConsumer时,使用JMSCorrelationID作为选择器(匹配请求消息的JMSMessageID),调用receive(long timeout)方法等待并获取响应消息。 - 解析响应:根据响应消息的类型(文本/字节),调用对应方法解析内容,完成业务处理。
- 释放资源:按顺序关闭
MessageConsumer、MessageProducer、Session和Connection,避免资源泄漏。
二、JMS连接IBM MQ时
MQRC_SELECTOR_SYNTAX_ERROR异常的解决 异常原因
报错MQRC_SELECTOR_SYNTAX_ERROR(错误码2459)的核心原因是创建MessageConsumer时传入的选择器不符合JMS语法规范。你的代码直接将message.getJMSCorrelationID()作为选择器参数,这是错误的——JMS选择器需要是包含属性名和匹配规则的表达式,而非单纯的属性值。
修正方案
将选择器修改为符合语法的表达式,明确指定JMSCorrelationID属性,并将ID值用单引号包裹(字符串类型属性值必须加单引号)。
修正后的代码片段:
producer.send(message); // Receive a message from reply queue // 修正选择器语法,指定属性名并包裹ID值 MessageConsumer consumer = session.createConsumer(replyQueue, "JMSCorrelationID = '" + message.getJMSCorrelationID() + "'"); Message replyMessage = consumer.receive(replyTimeout * 1000); if (replyMessage instanceof TextMessage) { logger.info(" Reply from CICS server.. TextMessage "); String replText = ((TextMessage) replyMessage).getText(); logger.info(" Reply from CICS server.. " + replText); } else if (replyMessage instanceof BytesMessage) { BytesMessage bytesMessage = (BytesMessage) replyMessage; int length = (int) bytesMessage.getBodyLength(); byte[] messageBytes = new byte[length]; bytesMessage.readBytes(messageBytes); String textMessage = new String(messageBytes, "UTF-8"); } // Close resources session.close(); connection.close();
额外注意事项
- 确保请求消息发送前,
JMSCorrelationID已正确关联请求的JMSMessageID(IBM MQ通常会自动将响应的JMSCorrelationID设置为请求的JMSMessageID,若未自动处理,可手动调用message.setJMSCorrelationID(message.getJMSMessageID()))。 - 选择器语法需严格遵循JMS规范,避免拼写错误或格式错误,比如数值类型属性无需加单引号,字符串类型必须加单引号。
内容的提问来源于stack exchange,提问作者Sheela
相关产品推荐
相关产品推荐

