gpt4 book ai didi

java - 有时从 ibm mq 返回的响应与请求不匹配

转载 作者:行者123 更新时间:2023-12-02 05:06:42 28 4
gpt4 key购买 nike

我复制了如何调用 IBM MQ 的 Java 客户端代码,并将请求传递到队列,但有时我从队列中得到错误的响应。

例如,如果我提交以下请求:F LOYFI6331760101046481882

我期望得到的回应F LOYFA36331760101046481882

但实际上我得到了F LOYFA36331760101051292448

如您所见,卡号是错误的。

这是代码

import javax.jms.BytesMessage;
import javax.jms.Destination;
import javax.jms.JMSConsumer;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSProducer;
import javax.jms.TextMessage;

import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;

public class MQClient {
// System exit status value (assume unset value to be 1)
private static int status = 1;

public static byte[] sendAndReceive(String HOST, Integer PORT, String QMGR, String CHANNEL, String requestQueue, String responseQueue, String payload) {
// Variables
JMSContext context = null;
Destination destination = null;
JMSProducer producer = null;
JMSConsumer consumer = null;
BytesMessage receivedMessage = null;
byte[] result = null;
try {
// Create a connection factory
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();

// Set the properties
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, HOST);
cf.setIntProperty(WMQConstants.WMQ_PORT, PORT);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, CHANNEL);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, QMGR);
cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "JmsPutGet (JMS)");
cf.setStringProperty(WMQConstants.WMQ_TARGET_CLIENT, "1");
// Create JMS objects
context = cf.createContext();
destination = context.createQueue("queue:///" + requestQueue +"?targetClient=1");

TextMessage message = context.createTextMessage(payload);

producer = context.createProducer();
producer.send(destination, message);
System.out.println("Sent message:\n" + message);

destination = context.createQueue("queue:///" + responseQueue + "?targetClient=1");
consumer = context.createConsumer(destination); // autoclosable
receivedMessage= (BytesMessage)consumer.receive();
System.out.println("Receiving message:" + receivedMessage);
int text_length = new Long(receivedMessage.getBodyLength()).intValue();
result = new byte[text_length];
receivedMessage.readBytes(result, text_length);

System.out.println("\nReceived message:\n" + new String(result));

recordSuccess();

} catch (JMSException jmsex) {
recordFailure(jmsex);
}finally {
context.close();
}

return result;

}
}

我有另一个项目要同时运行来调用 MQClient.sendAndReceive() 方法,具有相同的 hostportQMGR channelrequestQueueresponseQueue,只有 payload 不同。

那么如何修复上面的代码以确保我始终获得与请求相对应的正确响应?

编辑:1. 对于 JoshMac 问题,app 是指 IBM MQ 吗?或者将调用我的 sendAndReceive 函数的应用程序?

  • 这是我的流程,我使用 mule flow 从 POS 获取请求,处理请求,这需要调用 IBM MQ(位于 AS400 上),从 MQ 获取响应,然后发送回销售点。 (在此示例中,我需要向 INQ1 提交请求并从 INQR1 获取响应)。根据下面的答案,似乎 sendAndReceive 函数被视为 Requester,我需要另一个流程来调用 Responder 来处理响应,所以 receivedMessage= (BytesMessage)consumer.receive(); 不会卡住吗?如果我错了请纠正我
  • 最佳答案

    Can you use different topic to differentiate?

    当您进行点对点消息传递时,这是一个坏主意。

    destination = context.createQueue("queue:///" + responseQueue + "?targetClient=1");

    听起来您的responseQueue在多个消费者之间共享。您有 2 个选择:

    1. 创建您自己的临时动态队列并将其设置为“回复”队列

    Queue replyQ = session.createTemporaryQueue();
  • 使用 MsgId/CorrelId 请求-回复消息传递模式。
  • 即请遵循本页上的建议:Not able to get response from IBM MQ using JMS application

    关于java - 有时从 ibm mq 返回的响应与请求不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56345214/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com