/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.artemis.jms.example;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TemporaryQueue;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import java.util.HashMap;
import java.util.Map;
/**
* A simple JMS example that shows how to use Request/Replay style messaging.
*
* Of course, in a real world example you would re-use the session, producer, consumer and temporary queue
* and not create a new one for each message!
*
* Or better still use the correlation id, and just store the requests in a map, then you don't need a temporary queue at all
*/
public class RequestReplyExample {
public static void main(final String[] args) throws Exception {
final Map<String, TextMessage> requestMap = new HashMap<>();
Connection connection = null;
InitialContext initialContext = null;
try {
// Step 1. Start the request server
SimpleRequestServer server = new SimpleRequestServer();
server.start();
// Step 2. Create an initial context to perform the JNDI lookup.
initialContext = new InitialContext();
// Step 3. Lookup the queue for sending the request message
Queue requestQueue = (Queue) initialContext.lookup("queue/exampleQueue");
// Step 4. Lookup for the Connection Factory
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
// Step 5. Create a JMS Connection
connection = cf.createConnection();
// Step 6. Start the connection.
connection.start();
// Step 7. Create a JMS Session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Step 8. Create a JMS Message Producer to send request message
MessageProducer producer = session.createProducer(requestQueue);
// Step 9. Create a temporary queue used to send reply message
TemporaryQueue replyQueue = session.createTemporaryQueue();
// Step 10. Create consumer to receive reply message
MessageConsumer replyConsumer = session.createConsumer(replyQueue);
// Step 11. Create a request Text Message
TextMessage requestMsg = session.createTextMessage("A request message");
// Step 12. Set the ReplyTo header so that the request receiver knows where to send the reply.
requestMsg.setJMSReplyTo(replyQueue);
// Step 13. Sent the request message
producer.send(requestMsg);
System.out.println("Request message sent.");
// Step 14. Put the request message to the map. Later we can use it to
// check out which request message a reply message is for. Here we use the MessageID as the
// correlation id (JMSCorrelationID). You don't have to use it though. You can use some arbitrary string for
// example.
requestMap.put(requestMsg.getJMSMessageID(), requestMsg);
// Step 15. Receive the reply message.
TextMessage replyMessageReceived = (TextMessage) replyConsumer.receive();
System.out.println("Received reply: " + replyMessageReceived.getText());
System.out.println("CorrelatedId: " + replyMessageReceived.getJMSCorrelationID());
// Step 16. Check out which request message is this reply message sent for.
// Here we just have one request message for illustrative purpose. In real world there may be many requests and
// many replies.
TextMessage matchedMessage = requestMap.get(replyMessageReceived.getJMSCorrelationID());
System.out.println("We found matched request: " + matchedMessage.getText());
// Step 17. close the consumer.
replyConsumer.close();
// Step 18. Delete the temporary queue
replyQueue.delete();
// Step 19. Shutdown the request server
server.shutdown();
} finally {
// Step 20. Be sure to close our JMS resources!
if (connection != null) {
connection.close();
}
// Step 21. Also close the initialContext!
if (initialContext != null) {
initialContext.close();
}
}
}
}
class SimpleRequestServer implements MessageListener {
private Connection connection;
private Session session;
MessageProducer replyProducer;
MessageConsumer requestConsumer;
public void start() throws Exception {
// Get an initial context to perform the JNDI lookup.
InitialContext initialContext = new InitialContext();
// Lookup the queue to receive the request message
Queue requestQueue = (Queue) initialContext.lookup("queue/exampleQueue");
// Lookup for the Connection Factory
ConnectionFactory cfact = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
// Create a connection
connection = cfact.createConnection();
// Start the connection;
connection.start();
// Create a session
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Create a producer to send the reply message
replyProducer = session.createProducer(null);
// Create the request comsumer
requestConsumer = session.createConsumer(requestQueue);
// register the listener
requestConsumer.setMessageListener(this);
}
@Override
public void onMessage(final Message request) {
try {
System.out.println("Received request message: " + ((TextMessage) request).getText());
// Extract the ReplyTo destination
Destination replyDestination = request.getJMSReplyTo();
System.out.println("Reply to queue: " + replyDestination);
// Create the reply message
TextMessage replyMessage = session.createTextMessage("A reply message");
// Set the CorrelationID, using message id.
replyMessage.setJMSCorrelationID(request.getJMSMessageID());
// Send out the reply message
replyProducer.send(replyDestination, replyMessage);
System.out.println("Reply sent");
} catch (JMSException e) {
e.printStackTrace();
}
}
public void shutdown() throws JMSException {
connection.close();
}
}