Spring AMQP RabbitMQ示例

时间:2020-02-23 14:35:43  来源:igfitidea点击:

今天,我们将研究Spring AMQP RabbitMQ示例应用程序。

在本文中,我们将开发一个Spring AMQP RabbitMQ Messaging应用程序。
让我们现在开始。

Spring AMQP RabbitMQ示例

让我们开始使用Maven,Eclipse IDE和RabbitMQ Server开发Spring AMQP RabbitMQ Messaging应用程序。
对于所有其他Java IDE都是一样的。

请一一执行以下步骤:

  • 在Eclipse IDE中创建Maven Java项目
  • 开发Spring AMQP Publisher程序
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.");
	}
}
  • 配置Spring AMQP Publisher所需的bean: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>
  • 开发Spring AMQP Consumer(Spring MDP)程序
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()));
	}
}
  • 配置Spring AMQP Consumer需要的bean: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>
  • 开发Spring AMQP Rabbit Container程序以初始化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");
	}
}
  • 最终的pom.xml文件
<?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>
  • 我们最终的Maven项目结构

使用RabbitMQ服务器测试Spring AMQP RabbitMQ示例

  • 运行AMQP Publisher并观察RabbitMQ队列中的消息

在这里我们可以看到AMQP Publisher成功发送了10条消息。

  • RabbitMQ控制台在队列中显示10条消息

其中我们可以看到RabbitMQ队列已成功从AMQP Publisher接收到10条消息。

  • 运行AMQP Consumer并在Eclipse IDE中观察消息

其中我们可以看到AMQP消费者从RabbitMQ队列中逐条接收每个消息。

  • RabbitMQ控制台在队列中显示0条消息

在这里我们可以观察到RabbitMQ队列中有0条消息,这意味着AMQP消费者已成功接收了所有消息。