Я копирую клиентский код Java для вызова IBM MQ и передаю запрос в очередь, но иногда получаю неправильный ответ из очереди.
Например, если я отправлю следующий запрос: 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()
, с теми же host
, port
, QMGR
, channel
, requestQueue
и responseQueue
, только payload
отличается.
Итак, как мне исправить приведенный выше код, чтобы убедиться, что я всегда получаю правильный ответ, соответствующий запросу?
РЕДАКТИРОВАТЬ: 1. Для вопросов JoshMac приложение означает IBM MQ? Или приложение, которое будет вызывать мою функцию sendAndReceive
?
- Вот поток, который у меня есть: я использую поток мулов, принимаю запрос от POS, обрабатываю запрос, который нужно вызвать IBM MQ (который находится на AS400), чтобы получить ответ от MQ и отправить обратно в POS. (В этом примере мне нужно отправить запрос
INQ1
и получить ответ отINQR1
). Судя по приведенному ниже ответу, кажется, что функцияsendAndReceive
обрабатывается какRequester
, мне нужен другой поток для вызоваResponder
для обработки ответа, поэтомуreceivedMessage= (BytesMessage)consumer.receive();
не застрянет? Поправьте меня, если я ошибаюсь