今天我们将研究 RabbitMQ示例应用程序。在我之前的文章中,我们已经从理论上讨论了一些基础知识,以及如何安装和设置RabbitMQ服务器。请参考以下内容:
- SpringAMQP
- 春兔MQ
在本文中,我们将开发一个-RabbitMQ消息传递应用程序。我们现在就开始吧。
Spring AMQP RabbitMQ示例
让我们开始使用Maven、eclipseide和RabbitMQ服务器开发 RabbitMQ消息传递应用程序。对于所有其他javaide也是一样的。
请按以下步骤逐一进行:
- 在eclipseide中创建Maven Java项目
- 开发发布程序
- 配置 Publisher所需的bean: rabbit sender-上下文.xml
- 开发消费者(springmdp)计划
- 配置使用者所需的bean: rabbt侦听器-上下文.xml
- 开发兔子容器程序来初始化Spring Ioc容器
- 最终pom.xml文件文件
- 我们最终的Maven项目结构
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 = "-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.");
}
}
<?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>
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()));
}
}
<?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"/>
<rabbit:listener-container id="myListenerContainer" connection-factory="connectionFactory">
<rabbit:listener ref="asyncListener" queue-names="tpQueue"/>
</rabbit:listener-container>
</beans>
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("-rabbt-listener-context.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>
用RabbitMQ服务器测试 RabbitMQ示例
- 运行AMQP Publisher并观察RabbitMQ队列中的消息
- RabbitMQ控制台在队列中显示10条消息
- 运行AMQP消费者并观察eclipseide中的消息
- RabbitMQ控制台在队列中显示0条消息
在这里我们可以看到AMQP Publisher成功地发送了10条消息。
在这里我们可以看到,我们的RabbitMQ队列已经成功地从AMQP发布服务器接收了10条消息。
这里我们可以看到,AMQP使用者从RabbitMQ队列一个接一个地接收每个消息。
在这里我们可以看到RabbitMQ队列有0条消息,这意味着AMQP消费者已成功地接收到所有消息。
注:有了rabitmq消息传递的知识,您可以阅读更多关于api并学习新东西。同时,还可以查看RabbitMQ服务器文档,以获得有关交换、队列等的更多详细信息。
注:正如我在上一篇文章中所说的,api和RabbitMQ服务器都来自关键团队.
这就是开发 RabbitMQ消息传递示例的全部内容。我们将在接下来的文章中讨论和开发-ActiveMQ消息传递示例。
进一步阅读:阿帕奇 ActiveMQ.