ActiveMQ point-to-point messaging domain
This tutorial will show you how we can send a message to Queue using point-to-point messaging system in Apache ActiveMQ.
For more information on point-to-point messaging system please read tutorial https://roytuts.com/configure-jms-client-using-glassfish-3/Before you move forward please read the tutorial https://roytuts.com/apache-activemq-configuration-in-windows/ for configuring ActiveMQ but do not create any Queue.
Now we will look into the following steps in order to implement point-to-point messaging system.
1. Create a class called MessageProducer that will produce message or send message to the destination – Queue.
package com.roytuts.jms.producer;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import com.roytuts.jms.constants.JmsConstants;
public class MessageProducer {
private ConnectionFactory connectionFactory;
private Connection connection;
private Session session;
private javax.jms.MessageProducer messageProducer;
public void sendMessage(final String message) {
try {
// get the ConnectionFactory
// default broker URL is tcp://localhost:61616
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_BROKER_URL);
// create a Connection object
connection = connectionFactory.createConnection();
// start the connection
connection.start();
// create a Session object
// transaction false
// auto acknowledgment sent when sending or receiving a message
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// create a destination - Queue or Topic - where message will be
// sent or received from
Destination destination = session
.createQueue(JmsConstants.QUEUE_NAME);
// create a Producer who will send the message
messageProducer = session.createProducer(destination);
// create a TextMessage, there are many more message types
TextMessage textMessage = session.createTextMessage(message);
// send the message
messageProducer.send(textMessage);
System.out.println("Sending Message : " + textMessage);
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
messageProducer.close();
session.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
} 2. Create a class called MessageConsumer that will receive message from the destination – Queue.
package com.roytuts.jms.consumer;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import com.roytuts.jms.constants.JmsConstants;
public class MessageConsumer {
private ConnectionFactory connectionFactory;
private Connection connection;
private Session session;
private javax.jms.MessageConsumer messageConsumer;
public void consumeMessage() {
try {
// get the ConnectionFactory
// default broker URL is tcp://localhost:61616
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_BROKER_URL);
// create a Connection object
connection = connectionFactory.createConnection();
// start the connection
connection.start();
// create a Session object
// transaction false
// auto acknowledgment sent when sending or receiving a message
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// create a destination - Queue or Topic - where message will be
// sent or received from
Destination destination = session
.createQueue(JmsConstants.QUEUE_NAME);
// create a Producer who will send the message
messageConsumer = session.createConsumer(destination);
// consume message sent by Producer
Message message = messageConsumer.receive();
// check whether it is an instance of TextMessage
// because we have let Producer send TextMessage
// there may be other message type
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
System.out.println("Got message sent by Producer : "
+ textMessage);
} else {
throw new JMSException("Message must be a type of TextMessage");
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
messageConsumer.close();
session.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
} 3. Create a class called JmsConstants that will hold all constants related to JMS.
package com.roytuts.jms.constants;
public class JmsConstants {
private JmsConstants() {
}
public static final String QUEUE_NAME = "IN_QUEUE";
} 4. Create a main class that will run the MessageProducer.
package com.roytuts.jms.producer;
public class MessageProducerTest {
public static void main(String[] args) {
new MessageProducer()
.sendMessage("This message is coming from Message Producer.");
}
} 5.Create a main class that will run the MessageConsumer.
package com.roytuts.jms.consumer;
public class MessageConsumerTest {
public static void main(String[] args) {
new MessageConsumer().consumeMessage();
}
} 6. Run the MessageProducer.
Output
Sending Message : ActiveMQTextMessage {commandId = 0, responseRequired = false, messageId = ID:admin-PC-50423-1429331013443-1:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = null, destination = queue://IN_QUEUE, transactionId = null, expiration = 0, timestamp = 1429331013666, arrival = 0, brokerInTime = 0, brokerOutTime = 0, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = false, readOnlyBody = false, droppable = false, jmsXGroupFirstForConsumer = false, text = This message is coming from Message Producer.} 7. Go to the ActiveMQ Web Console and click on Queues. You will see one message is enqueued in the IN_QUEUE and pending for consumption because at this moment the MessageConsumer is not up and running.

8. Run the MessageConsumer.
Output
Got message sent by Producer : ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId = ID:admin-PC-50413-1429330725391-1:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:admin-PC-50413-1429330725391-1:1:1:1, destination = queue://IN_QUEUE, transactionId = null, expiration = 0, timestamp = 1429330725957, arrival = 0, brokerInTime = 1429330725960, brokerOutTime = 1429330834373, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@6824be, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = This message is coming from Message Producer.} 9. Now again click on Queues in ActiveMQ Web Console. You will not see any message in the IN_QUEUE because as soon as you ran the MessageConsumer the message has been consumed by the MessageConsumer and now you will see one message has been dequeued.
Note: if you run the MessageConsumer first then MessageProducer then you will not see any message pending in the IN_QUEUE.
Here is the pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.roytuts</groupId>
<artifactId>apache-activemq</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>apache-activemq</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jdk.version>1.8</jdk.version>
<junit.version>4.11</junit.version>
<slf4j.version>1.7.5</slf4j.version>
<activemq.version>5.11.1</activemq.version>
<spring.version>4.1.5.RELEASE</spring.version>
</properties>
<dependencies>
<!-- activemq -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>${activemq.version}</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
That’s all. Thank you for reading.

No comments
Leave a comment