我们使用 IBM MQ 以请求/回复方式与第三方通信。我们向他们发送请求,他们给我们答复。 目前我们都有一个简单的基于 Java 的 native IBM MQ 应用程序。 我们计划使用 spring jms 重写我们的代码。 但是当使用 spring jms 时,我们在给定时间内没有得到任何响应。我们正在使用 JMSTemplate 发送或接收消息。 我正在分享我的代码片段。我在这里做错了什么吗?我应该在这里设置任何其他属性吗?
// Request Part (we are sending request)
String request // this is the request string
byte[] reqData = request.getBytes(); // converting it into byte array to send
TextMessage txtMsg = session.createTextMessage(String.valueOf(reqData));
Destination replyToQName = jmsTemplate.getDestinationResolver().resolveDestinationName(session, responseQueueName, false);
txtMsg.setJMSReplyTo(replyToQName);
Destination requestQ = jmsTemplate.getDestinationResolver().resolveDestinationName(session, requestQueueName, false);
((JmsDestination) requestQ).setBooleanProperty( WMQConstants.WMQ_MQMD_WRITE_ENABLED, true );
((MQQueue) requestQ).setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ); // setting this because third party application is native websphere mq java application
jmsTemplate.convertAndSend(requestQ, txtMsg);
// saved msgId of request for late use
String messageId = txtMsg.getJMSMessageID();
// Response fetching part
Destination responseQ = jmsTemplate.getDestinationResolver().resolveDestinationName(session, responseQueueName, false);
((JmsDestination) responseQ).setBooleanProperty(WMQConstants.WMQ_MQMD_READ_ENABLED, true);
((JmsDestination) responseQ).setObjectProperty( WMQConstants.JMS_IBM_MQMD_CORRELID, msgIdText);
jmsTemplate.setReceiveTimeout(30000L);
String filter = "JMSCorrelationID='" + messageId + "'"; // to match request message's messageId with response message's correlationId
TextMessage respMsg = (TextMessage) jmsTemplate.receiveSelected(responseQ, filter);
下面是我的 connectionFactory 代码:
MQConnectionFactory factory = new MQQueueConnectionFactory();
factory.setHostName("hostname");
factory.setPort(1420);
factory.setQueueManager("QM1");
factory.setChannel("TEST.CHANNEL");
factory.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
最佳答案
这里的主要问题是尚未执行基本诊断,或者如果执行了则结果未在问题中显示。我不知道 Spring,但我知道基本的 MQ 调试。我还住在密苏里州,“告诉我”州,足够长的时间将州格言采纳为我自己的格言。告诉我所有的假设是如何被验证的。作为 MQ 管理员,我会与开发人员一起通过目视检查来确认所有假设。以下是我的处理方式:
检查出站消息
- 停止出站 channel
- PUT 请求消息
- 获取(启用)XMitQ 并浏览消息
a) 消息是否出现?
b) 消息的格式和值是否正确?
c) 回复字段是否正确填充?
d) 消息是否过期?如果是,过期时间是否足够长?
检查返回信息
- 停止应用
- 重启出站 channel
- 浏览回复队列
a) 消息到达了吗?
b) 它的格式和填充是否正确?
总结
最后,只有两种可能出错的情况,而且都很容易检查。
首先,新程序可能根本没有放置任何消息。在重构代码以使用新框架时,这实际上很常见。尝试在不积极验证消息获取 PUT 的情况下进行调试(并在问题中明确说明这是如何完成的以及结果)是一个非常大的假设。不要假设。确认已生成消息并在询问时告诉我们详细信息,以便我们将其作为根本原因消除。
其次,从接受请求的应用程序向后工作,如果它们相同,则不关心哪个应用程序发送消息。假设请求者应用程序实际上正在发送一条消息,它不能与旧消息相同,因为它从远程服务器应用程序得到不同的 react 。比较来自旧应用程序版本和新应用程序版本的同一事务的消息。以十六进制打印出来,必要时逐字节比较。
执行这种鉴别诊断后,可能会缩小关注范围并找到根本原因。如果没有生成消息,则要检查的事项列表与要检查是否实际生成了消息的项目列表完全不同。不进行基本诊断也可以解决这个问题,但那是个异常(exception)。所以我的非答案答案是:从进行基本诊断开始。
关于java - 无法使用 JMS 应用程序从 IBM MQ 获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49140130/