Отправка данных в очередь и прослушивание данных в той же функции - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать функцию, в которой я отправляю сообщение JMS в очередь и слушаю ответ в другой очереди.Две очереди разные, и я хочу вернуться, когда ответ будет доступен из второй очереди.Как мне это сделать?Должен ли я сделать в то время как (правда)?Выполнение MessageListener похоже заставляет меня вызывать другую функцию для получения ответа, когда я хочу вернуть функцию с ответом, который отправил данные.

1 Ответ

0 голосов
/ 07 февраля 2019

Есть много способов сделать это, но я думаю, что самый простой способ в JMS 1.1 - это использование javax.jms.QueueRequestor .Это простой интерфейс, который заботится обо всем коде котельной пластины, который вы будете использовать с шаблоном запроса / ответа вручную.Например, запросчик может выглядеть так:

InitialContext initialContext new InitialContext();
Queue queue = (Queue) initialContext.lookup("myQueue");
QueueConnectionFactory cf = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");
QueueConnection connection = cf.createQueueConnection();
connection.start();
QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueRequestor queueRequestor = new QueueRequestor(session, queue);
TextMessage request = session.createTextMessage("Hello, World!");
TextMessage reply = (TextMessage) queueRequestor.request(request);
queueRequestor.close();

Тогда компонент, который получает сообщение и предоставляет ответ, может выглядеть следующим образом:

InitialContext initialContext new InitialContext();
Queue queue = (Queue) initialContext.lookup("myQueue");
QueueConnectionFactory cf = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");
QueueConnection connection = cf.createQueueConnection();
connection.start();
QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer messageConsumer = session.createConsumer(queue);
TextMessage request = (TextMessage) messageConsumer.receive();
TextMessage reply = session.createTextMessage("reply: " + request.getText());
Destination replyTo = request.getJMSReplyTo();
try (MessageProducer producer = session.createProducer(replyTo)) {
    producer.send(reply);
}

Если вы являетесь JMS-провайдеромподдерживает 2.0, тогда вы можете сделать что-то вроде этого для клиента, отправляющего запрос:

InitialContext initialContext new InitialContext();
Queue requestQueue = (Queue) initialContext.lookup("requestQueue");
Queue responseQueue = (Queue) initialContext.lookup("responseQueue");
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
String correlationID = UUID.randomUUID().toString();
JMSContext context = cf.createContext();
context.createProducer().setJMSCorrelationID(correlationID).send(requestQueue, context.createTextMessage("requestMessage"));
Message reply = context.createConsumer(responseQueue, "JMSCorrelationID = '" + correlationID + "'").receive();

И что-то вроде этого для ответчика:

InitialContext initialContext new InitialContext();
Queue requestQueue = (Queue) initialContext.lookup("requestQueue");
Queue responseQueue = (Queue) initialContext.lookup("responseQueue");
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
JMSContext context = cf.createContext();
Message request = context.createConsumer(requestQueue).receive();
context.createProducer().setJMSCorrelationID(request.getJMSCorrelationID()).send(responseQueue, context.createTextMessage("responseMessage"));
...