Spring AMQP RabbitMQ Example

Today we will look into Spring AMQP RabbitMQ example application. We have already discussed some “Spring AMQP Basics Theoretically” and “How to install and setup RabbitMQ Server” in my previous posts. Please refer them in the following:

In this post, we are going to develop a Spring AMQP RabbitMQ Messaging application. Let us start it now.

Spring AMQP RabbitMQ Example

Let us start developing a Spring AMQP RabbitMQ Messaging application using Maven, Eclipse IDE and RabbitMQ Server. It is same for all other Java IDEs.

Please do the following the steps one by one:

    1. Create a Maven Java project in Eclipse IDE
    2. Develop Spring AMQP Publisher program

package com.tp.spring.amqp.rabbit;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringAMQPRabbitSender {
    private final String SENDER_XML = "springamqp-rabbit-sender-context.xml";
    public static void main(String[] args) throws Exception {
      AmqpTemplate amqpTemplate = (AmqpTemplate)(new ClassPathXmlApplicationContext(SENDER_XML)).getBean("amqpTemplate");
      int messagCount = 0;
	  while (messagCount < 10){
	    amqpTemplate.convertAndSend("tp.routingkey.1", "Message # " + messagCount++);
	  }
	  System.out.println( messagCount + " message(s) sent successfully.");
	}
}
    1. Configure Spring AMQP Publisher required beans : springamqp-rabbit-sender-context.xml

<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
	  xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	  xmlns:rabbit="https://www.springframework.org/schema/rabbit"
	  xsi:schemaLocation="https://www.springframework.org/schema/beans
	  https://www.springframework.org/schema/beans/spring-beans-3.1.xsd
	  https://www.springframework.org/schema/rabbit
	  https://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">
	<rabbit:connection-factory id="connectionFactory"
	host="localhost" username="tpuser" password="tpuser"/>
	<rabbit:admin connection-factory="connectionFactory"/>
	<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
	exchange="tpExchange"/>
</beans>
    1. Develop Spring AMQP Consumer(Spring MDP) program

package com.tp.spring.amqp.rabbit;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
// Spirng MDP(Message Driven POJO)
public class SpringAMQPRabbitAyncListener implements MessageListener {
	@Override
	public void onMessage(Message message) {
		System.out.println("Listener received message = " + new String(message.getBody()));
	}
}
    1. Configure Spring AMQP Consumer required beans : springamqp-rabbt-listener-context.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
	  xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
          xmlns:rabbit="https://www.springframework.org/schema/rabbit"
	  xsi:schemaLocation="https://www.springframework.org/schema/beans
	  https://www.springframework.org/schema/beans/spring-beans-3.1.xsd
	  https://www.springframework.org/schema/rabbit
	  https://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">
	<rabbit:connection-factory id="connectionFactory" host="localhost"
              username="tpuser" password="tpuser"/>
	<rabbit:admin connection-factory="connectionFactory"/>
	<rabbit:queue id="tpQueue"/>
	<rabbit:topic-exchange id="tpExchange" name="tpExchange">
		<rabbit:bindings>
			<rabbit:binding queue="tpQueue" pattern="tp.routingkey.1">
			</rabbit:binding>
		</rabbit:bindings>
	</rabbit:topic-exchange>
	<bean id="asyncListener" class="com.tp.spring.amqp.rabbit.SpringAMQPRabbitAyncListener"/>
	<rabbit:listener-container id="myListenerContainer" connection-factory="connectionFactory">
		<rabbit:listener ref="asyncListener" queue-names="tpQueue"/>
	</rabbit:listener-container>
</beans>
    1. Develop Spring AMQP Rabbit Container program to initialize Spring IOC Container

package com.tp.spring.amqp.rabbit;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringAMQPRabbitlListenerContainer {
	public static void main(String[] args) {
        // Initialize Spring IOC Container
        new ClassPathXmlApplicationContext("springamqp-rabbt-listener-context.xml");
	}
}
    1. Final pom.xml file

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.tp</groupId>
	<artifactId>spring-amqp-rabbitmq</artifactId>
	<name>spring-amqp-rabbitmq</name>
	<packaging>jar</packaging>
	<version>1.0.0</version>
	<properties>
		<java-version>1.6</java-version>
		<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
		  <groupId>org.springframework</groupId>
		  <artifactId>spring-context</artifactId>
		  <version>${org.springframework-version}</version>
		  <exclusions>
			<!-- Exclude Commons Logging in favor of SLF4j -->
			<exclusion>
				<groupId>commons-logging</groupId>
				<artifactId>commons-logging</artifactId>
			 </exclusion>
		  </exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>
		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.amqp</groupId>
			<artifactId>spring-rabbit</artifactId>
			<version>1.1.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.amqp</groupId>
			<artifactId>spring-amqp</artifactId>
			<version>1.1.4.RELEASE</version>
		</dependency>
	</dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
    1. Our Final Maven Project Structure
    2. spring_rabbitmq_amqp_example

Test Spring AMQP RabbitMQ Example with RabbitMQ Server

    1. Run AMQP Publisher and observe messages in RabbitMQ Queue
    2. spring_rabbitmq_amqp_sender (1)

Here we can see that AMQP Publisher sent 10 messages successfully.

    1. RabbitMQ console is showing 10 messages in the queue
    2. spring_rabbitmq_amqp_sender2

Here we can see that our RabbitMQ queue has received 10 messages successfully from AMQP Publisher.

    1. Run AMQP Consumer and observe messages in Eclipse IDE
    2. spring_rabbitmq_amqp_receiver (1)

Here we can see that AMQP Consumer receives each message one by one from RabbitMQ queue.

    1. RabbitMQ console is showing 0 messages in the queue
    2. spring_rabbitmq_amqp_receiver2

Here we can observe that RabbitMQ queue has 0 messages that means AMQP Consumer has received all messages successfully.

NOTE: With this knowledge of Spring AMQP RabbitMQ Messaging, you can read more about Spring AMQP API and learn new things. And also go through RabbitMQ Server documentation to get more details about Exchanges, Queues etc.

NOTE: As I told you in my previous post, both Spring AMQP API and RabbitMQ Server are from The Pivotal Team.

That’s it all about developing Spring AMQP RabbitMQ Messaging Example. We will discuss and develop Spring AMQP ActiveMQ Messaging Example in my coming posts.

Further Reading: Apache ActiveMQ.

By admin

Leave a Reply

%d bloggers like this: