2.RabbitMq+Spring整合测试
来源:互联网 发布:hadoop和java的关系 编辑:程序博客网 时间:2024/06/10 23:12
1.介绍以及准备工作
我这里建立两个工程,producer工程发送消息,consumer工程接收消息。
这里测试了direct、topic交换机。
producer工程中申明queue1、queue2绑定direct交换机、申明queue3绑定topic交换机
consumer工程中申明了三个消费者分别监听queue1、queue2、queue3
下面例子保证跑通
centos下开启rabbitmp服务,访问web窗口并用户登录
http:192.168.88.131:15672/
2.消息生产者(producer)
(1)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.tyf</groupId> <artifactId>rabbitMq-spring</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>rabbitMq-spring</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 添加Spring依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!--rabbitmq依赖 --> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.3.5.RELEASE</version> </dependency> </dependencies></project>
(2)resources/rabbitmq.xml
主要是配置连接,申明队列,绑定队列
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd"> <!-- 测试direct交换机 --> <!-- connection-factory(连接rabbitmq-server) --> <rabbit:connection-factory id="connectionFactory" username="uname" password="pword" host="192.168.88.131" port="5672" /> <!-- template(数据操作类,指定连接工厂,指定交换机名称) --> <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="exchangeTest"/> <!--admin信息(当前producer中的exchange和queue会在rabbitmq-server上自动生成) --> <rabbit:admin id="connectAdmin" connection-factory="connectionFactory"/> <!-- queue1 --> <rabbit:queue name="queue1" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin"/> <!-- queue2 --> <rabbit:queue name="queue2" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin"/> <!-- queue1/queue2绑定direct交换机 --> <rabbit:direct-exchange name="exchangeTest" durable="true" auto-delete="false" declared-by="connectAdmin"> <rabbit:bindings> <rabbit:binding queue="queue1" key="queueKey1"></rabbit:binding> <rabbit:binding queue="queue2" key="queueKey2"></rabbit:binding> </rabbit:bindings> </rabbit:direct-exchange> <!-- 测试topic交换机 --> <!-- connection-factory(连接rabbitmq-server) --> <rabbit:connection-factory id="connectionFactory2" username="uname" password="pword" host="192.168.88.131" port="5672"/> <!-- template(数据操作类) --> <rabbit:template id="amqpTemplate2" connection-factory="connectionFactory2" exchange="exchangeTest2"/> <!--admin信息(当前producer中的exchange和queue会在rabbitmq-server上自动生成) --> <rabbit:admin id="connectAdmin2" connection-factory="connectionFactory2"/> <!--定义queue3 --> <rabbit:queue name="queue3" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin2"/> <!-- queue3绑定topic交换机 --> <rabbit:topic-exchange name="exchangeTest2" durable="true" auto-delete="false" declared-by="connectAdmin2"> <rabbit:bindings> <rabbit:binding queue="queue3" pattern="*.queueKey3"></rabbit:binding> </rabbit:bindings> </rabbit:topic-exchange> </beans>
(3)resources/application.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <import resource="classpath*:rabbitmq.xml" /> <!-- 扫描指定package下所有带有如@controller,@services,@resource,@ods并把所注释的注册为Spring Beans --> <context:component-scan base-package="com.tyf.rabbitMq_spring" /> <!-- 定义生产者 --> <bean id="messageProducer" class="com.tyf.rabbitMq_spring.MessageProducer"></bean> <!-- 激活annotation功能 --> <context:annotation-config /> <!-- 激活annotation功能 --> <context:spring-configured /> </beans>
(4)发送消息的bean(MessageProducer)
主要是操作ampqTemplate向队列发送消息
package com.tyf.rabbitMq_spring;import java.io.IOException;import javax.annotation.Resource;import org.springframework.amqp.core.AmqpTemplate;import org.springframework.stereotype.Service;@Service public class MessageProducer { //direct @Resource(name="amqpTemplate") private AmqpTemplate amqpTemplate; //topic @Resource(name="amqpTemplate2") private AmqpTemplate amqpTemplate2; public void sendMessage(Object message) throws IOException { //direct交换机 amqpTemplate.convertAndSend("queueKey1", message); System.out.println("向queueKey1发送了消息"); amqpTemplate.convertAndSend("queueKey2", message); System.out.println("向queueKey2发送了消息"); //topic交换机(这个占位符在前面或者后面都可以这里是*.key的形式) amqpTemplate2.convertAndSend("yyy.queueKey3", message); System.out.println("向queueKey3发送了消息"); amqpTemplate2.convertAndSend("zzz.queueKey3", message); System.out.println("向queueKey3发送了消息"); } }
(5)app
package com.tyf.rabbitMq_spring;import java.io.IOException;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) throws IOException { //上下文读取配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"/application.xml"}); context.start();//创建一个生产者 MessageProducer messageProducer = (MessageProducer) context.getBean("messageProducer"); //生产者发送消息 messageProducer.sendMessage("生产者消息~~");} }
(6)运行app
app中读取配置文件后直接使用messageProducer向队列发送消息,控制台结果:
查看rabbitmq的管理页面可以看到spring配置文件中申明的交换机和队列,消息在队列中堆积(因为现在还没有消息消费者)
3.消息接受者(consumer)
(1)pom.xml
同上不变
(2)resources/rabbitmq.xml
同上面类似,只是增加了三个消息接收者bean以及监听队列的配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd"> <!-- 测试direct交换机 --> <!-- connection-factory(连接rabbitmq-server) --> <rabbit:connection-factory id="connectionFactory" username="uname" password="pword" host="192.168.88.131" port="5672" /> <!-- template(数据操作类) --> <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="exchangeTest"/> <!--admin信息(当前producer中的exchange和queue会在rabbitmq-server上自动生成) --> <rabbit:admin id="connectAdmin" connection-factory="connectionFactory"/> <!-- queue1 --> <rabbit:queue name="queue1" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin"/> <!-- queue2 --> <rabbit:queue name="queue2" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin"/> <!-- queue1/queue2绑定交换机 --> <rabbit:direct-exchange name="exchangeTest" durable="true" auto-delete="false" declared-by="connectAdmin"> <rabbit:bindings> <rabbit:binding queue="queue1" key="queueKey1"></rabbit:binding> <rabbit:binding queue="queue2" key="queueKey2"></rabbit:binding> </rabbit:bindings> </rabbit:direct-exchange> <!-- 消费者1 --> <bean id="messageConsumer1" class="com.tyf.rabbitMq_spring.MessageConsumer1"></bean> <!-- 消费者2 --> <bean id="messageConsumer2" class="com.tyf.rabbitMq_spring.MessageConsumer2"></bean> <!-- 消费者1/消费者2监听queue1 --> <rabbit:listener-container connection-factory="connectionFactory"> <rabbit:listener queues="queue1" ref="messageConsumer1"/> <rabbit:listener queues="queue2" ref="messageConsumer2"/> </rabbit:listener-container> <!-- 测试topic交换机 --> <!-- connection-factory(连接rabbitmq-server) --> <rabbit:connection-factory id="connectionFactory2" username="uname" password="pword" host="192.168.88.131" port="5672"/> <!-- template(数据操作类) --> <rabbit:template id="amqpTemplate2" connection-factory="connectionFactory2" exchange="exchangeTest2"/> <!--admin信息(当前producer中的exchange和queue会在rabbitmq-server上自动生成) --> <rabbit:admin id="connectAdmin2" connection-factory="connectionFactory2"/> <!-- queue3 --> <rabbit:queue name="queue3" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin2"/> <!-- queue3绑定交换机 --> <rabbit:topic-exchange name="exchangeTest2" durable="true" auto-delete="false" declared-by="connectAdmin2"> <rabbit:bindings> <rabbit:binding queue="queue3" pattern="queueKey3.*"></rabbit:binding> </rabbit:bindings> </rabbit:topic-exchange> <!-- 消费者3 --> <bean id="messageConsumer3" class="com.tyf.rabbitMq_spring.MessageConsumer3"></bean> <!-- 消费者3监听queue3--> <rabbit:listener-container connection-factory="connectionFactory2" > <rabbit:listener queues="queue3" ref="messageConsumer3"/> </rabbit:listener-container> </beans>
(3)resources/application.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <import resource="classpath*:rabbitmq.xml" /> <!-- 扫描指定package下所有带有如@controller,@services,@resource,@ods并把所注释的注册为Spring Beans --> <context:component-scan base-package="com.tyf.rabbitMq_spring" /> <!-- 激活annotation功能 --> <context:annotation-config /> <!-- 激活annotation功能 --> <context:spring-configured /> </beans>
(4)三个消息接受者bean
继承MessageListenerpackage com.tyf.rabbitMq_spring;import org.springframework.amqp.core.Message;import org.springframework.amqp.core.MessageListener;public class MessageConsumer1 implements MessageListener{public void onMessage(Message message) {System.out.println("消费者 :"+this.getClass().getName()+" , "+"消息 :"+message);}}package com.tyf.rabbitMq_spring;import org.springframework.amqp.core.Message;import org.springframework.amqp.core.MessageListener;public class MessageConsumer2 implements MessageListener{public void onMessage(Message message) {System.out.println("消费者 :"+this.getClass().getName()+" , "+"消息 :"+message);}}package com.tyf.rabbitMq_spring;import org.springframework.amqp.core.Message;import org.springframework.amqp.core.MessageListener;public class MessageConsumer3 implements MessageListener{public void onMessage(Message message) {System.out.println("消费者 :"+this.getClass().getName()+" , "+"消息 :"+message);}}
(5)app
package com.tyf.rabbitMq_spring;import java.io.IOException;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) throws IOException { //上下文读取配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"/application.xml"}); context.start(); } }
(6)启动app
刚启动app你就会发现堆积在队列里面的消息会立即发送过来,查看控制台信息
再次查看rabbitmq的管理页面消息都被消费啦~~
阅读全文
0 0
- 2.RabbitMq+Spring整合测试
- 【RabbitMQ】RabbitMQ与Spring整合
- Spring整合Rabbitmq
- Spring整合Rabbitmq
- rabbitMq入门,整合spring
- spring rabbitmq 整合配置
- rabbitmq整合spring
- spring 整合 rabbitmq
- Spring整合RabbitMQ简介
- Spring整合RabbitMQ
- rabbitmq整合spring
- rabbitmq与spring整合
- spring整合rabbitmq
- rabbitmq整合spring
- spring整合rabbitmq
- spring整合rabbitMq
- Spring Boot整合RabbitMQ
- rabbitmq整合spring
- Hello,CSDN
- JAVA XML
- ruby 冻结对象
- window7系统安装VMware8 报错及解决办法
- IntelliJ IDEA 使用心得与常用快捷键
- 2.RabbitMq+Spring整合测试
- git push报错 refusing to update checked out branch 解决办法
- C#中string format的使用
- 关于监控方案的一点想法供参考
- 原型克隆模式
- java注解实战
- qt: The build directory needs to be at the same level as the source directory.
- hdu 6253 Knightmare
- 如何让交互稿的体验更好