The complete Java source code is on github, here I comment just what I think are the most interesting part of the code.
This it the client, after establishing a connection to the broker:
Destination destination = session.createQueue(REQUEST_QUEUE_NAME); // 1 MessageProducer producer = session.createProducer(destination); Destination dRep = session.createTemporaryQueue(); // 2 TextMessage message = session.createTextMessage(arg); message.setJMSCorrelationID(UUID.randomUUID().toString()); // 3 message.setJMSReplyTo(dRep); // 4 producer.send(message); // ... MessageConsumer consumer = session.createConsumer(dRep); // 5 Message reply = consumer.receive(); // 6 // ...1. The queue where the requests are sent.
2. A second queue, for the replies. We could have used a "normal" queue, but it is more common to create a cheaper temporary queue for this task.
3. We could keep track by hand of the unique message ids generated by the application, or we could delegate to Java the generation of an unique id, as I did here.
4. The queue to be used as destination for the reply is stored in the JMSReplyTo message property.
5. A consumer is created on the reply queue.
6. And the client patiently waits for an answer from the server.
The interesting part of the server is where it replies to the client:
if(message instanceof TextMessage) { TextMessage answer = session.createTextMessage(); // 1 answer.setText("Reply to " + ((TextMessage) message).getText()); answer.setJMSCorrelationID(message.getJMSCorrelationID()); // 2 MessageProducer producer = session.createProducer(null); // 3 producer.send(message.getJMSReplyTo(), answer); }1. The message to be sent as answer.
2. The correlation id is sent back to the client.
3. A producer with no associated queue is created, we are going to explicitly set the destination in its send() method using the JMSReplyTo message property.