Я копирую код 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();
не застрянет?Поправь меня, если я не прав