我们使用 IBM MQ 以请求/回复方式与第三方进行通信。我们向他们发送请求,他们给我们答复。
目前,我们都有一个简单的基于 Java 的本机 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);
下面是我的连接工厂代码:
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 管理员,我将与开发人员合作,通过目视检查确认所有假设。我的处理方法如下:
检查出站消息
- 停止出站通道
- PUT 请求消息
- 获取(启用)XMitQ 并浏览消息
a) 是否出现该消息?
b) 消息的格式和值是否正确?
c) 回复字段是否正确填写?
d) 消息是否过期,如果过期,过期时间是否足够长?
检查返回消息
- 停止应用程序
- 重启出站通道
- 浏览回复队列
a) 有消息到达吗?
b) 格式和填充是否正确?
Summary
最后,只有两种可能出现问题的情况,而且都很容易检查。
首先,新程序可能根本没有发出任何消息。在重构代码以使用新框架时,这实际上很常见。在没有积极验证消息被 PUT 的情况下尝试调试(并在问题中明确说明这是如何完成的以及结果)是一个非常大的假设。不要假设。验证消息是否已生成,并在询问时告诉我们详细信息,以便我们可以消除这一根本原因。
其次,从接受请求的应用程序开始向后工作,它并不关心哪个应用程序发送消息(如果它们相同)。假设请求者应用程序实际上正在 PUT 一条消息,它不能与旧消息相同,因为它从远程服务器应用程序得到不同的反应。比较新旧应用程序版本中同一事务的消息。以十六进制打印它们,并在必要时逐字节进行比较。
进行这种鉴别诊断后,就有可能缩小焦点并找出根本原因。如果没有生成消息则检查的项目列表与检查是否实际生成消息的项目列表有很大不同。也许可以在不进行基本诊断的情况下解决此问题,但这是例外。所以我的非答案答案是:从进行基本诊断开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)