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
继承MessageListener
package 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的管理页面消息都被消费啦~~