Я подключаюсь к IBM Websphere MQ. Я хочу иметь возможность сопоставить ответное сообщение с правильным сообщением запроса. Я пролистал сотни страниц, чтобы получить это, и мне не повезло.
У меня есть класс MQHandler, который отправляет сообщение в одну определенную очередь и читает запрос из другой. Однако это работает нормально, если приложение одновременно используют несколько пользователей, сообщения перепутаны.
Кажется, я не могу получить метод на приемнике, чтобы указать соответствующий идентификатор CorrelationID.
Что-то вроде ...
customer.receive (селектор);
Можете ли вы проверить приведенные ниже методы, чтобы убедиться, что я делаю это правильно?
/**
* When the class is called, this initialisation is done first.
*
* @throws JMSException
*/
public void init() throws JMSException
{
// Create a connection factory
JmsFactoryFactory ff;
try
{
ff = JmsFactoryFactory.getInstance( WMQConstants.WMQ_PROVIDER );
cf = ff.createConnectionFactory();
// Set the properties
cf.setStringProperty( WMQConstants.WMQ_HOST_NAME, hostServer );
cf.setIntProperty( WMQConstants.WMQ_PORT, 1414 );
cf.setStringProperty( WMQConstants.WMQ_CHANNEL, channel );
cf.setIntProperty( WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT );
cf.setStringProperty( WMQConstants.WMQ_QUEUE_MANAGER, qManager );
connection = cf.createConnection();
session = connection.createSession( false, Session.AUTO_ACKNOWLEDGE );
}
catch( JMSException e )
{
throw e;
}
} // end of init
/**
* @param request
* @return
* @throws JMSException
*/
private String sendRequest( String request ) throws JMSException
{
// Create JMS objects
Destination destination = session.createQueue( "queue:///" + writeQueueName );
// Enable write of MQMD fields. See documentation for further
// details.
((JmsDestination) destination).setBooleanProperty( WMQConstants.WMQ_MQMD_WRITE_ENABLED, true );
// Set message context, if needed. See comment at the top.
// Create a producer
MessageProducer producer = session.createProducer( destination );
// Create a message
TextMessage message = session.createTextMessage( request );
// Generate a custom message id
message.setJMSCorrelationID( generateRandomID() );
// Start the connection
connection.start();
// And, send the message
producer.send( message );
System.out.println(message);
return message.getJMSCorrelationID();
}
/**
* @param customMessageId
* @return
* @throws JMSException
*/
private String recvResponse( String customMessageId ) throws JMSException
{
Destination destination = session.createQueue( "queue:///" + readQueueName );
// Enable read of MQMD fields.
((JmsDestination) destination).setBooleanProperty( WMQConstants.WMQ_MQMD_READ_ENABLED, true );
((JmsDestination) destination).setObjectProperty( WMQConstants.JMS_IBM_MQMD_CORRELID, customMessageId );
// Create a consumer
MessageConsumer consumer = session.createConsumer( destination );
// Start the connection
connection.start();
// And, receive a message from the queue
TextMessage receivedMessage = (TextMessage)consumer.receive( 15000 );
connection.close();
session.close();
return receivedMessage.getText();
}
Вот фрагмент основного метода ...
try
{
String customMessageId;
init();
customMessageId = sendRequest( request );
return recvResponse( customMessageId );
}
catch( Exception ex )
{
System.out.println( "Error on MQ." );
throw new Exception( "\n\n*** An error occurred ***\n\n" + ex.getLocalizedMessage()
+ "\n\n**********************************" );
}