spring集成rabbitMq(非springboot)

首先 , pom文件需要加入spring集成rabbitMq的依赖:

<dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>1.6.3.RELEASE</version>
   </dependency>

发送端spring的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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:rabbit="http://www.springframework.org/schema/rabbit"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
    http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd
    http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">

    <!-- rabbitMQ配置 -->
    <bean id="rabbitConnectionFactory"
      class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <constructor-arg value="192.168.1.11"/>
        <property name="username" value="root"/>
        <property name="password" value="lee13233"/>
        <property name="channelCacheSize" value="8"/>
        <property name="port" value="5672"></property>
    </bean>
    <rabbit:admin connection-factory="rabbitConnectionFactory"/>

    <!-- autoDelete:是否自动删除 durable:持久化  -->
    <rabbit:queue name="test123queue" durable="true"/>
    <rabbit:queue name="test321queue" durable="true"/>

<!-- topic主题 -->
    <rabbit:topic-exchange name="leo.pay.topic.exchange" xmlns="http://www.springframework.org/schema/rabbit" durable="true">
      <bindings>
        <binding queue="test123queue" pattern="*.*.test123" />
        <binding queue="test321queue" pattern="test321.#" />
      </bindings>
    </rabbit:topic-exchange>

    <!-- 创建rabbitTemplate 消息模板类 -->
    <bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate">
        <constructor-arg ref="rabbitConnectionFactory"></constructor-arg>
    </bean>

</beans>

 

发送端的java代码:

@Test
    public void testRabbitMq() throws Exception {
        RabbitTemplate rabbitTemplate = (RabbitTemplate) LeoContext.getContext().getApplication().getBean("rabbitTemplate");
        //第二个参数为路由key(routingKey)的值,当路由可以为test321.hello.test123时,两个消费队列都可以收到消息,当值为test321.hello.aaa时,只有绑定了test321.#的队列才可以收到消息,当值为ta1.hello.test123,只有绑定了*.*.test123的队列才可收到消息
        for(int i = 1; i <= 10; i++) {
            String str = "hello" + i;
        rabbitTemplate.send("leo.pay.topic.exchange", "test321.hello.test123", new Message(str.getBytes(), new MessageProperties()));
        }
    }

 

接收端(我配置的接收端与发送端不在同一个项目)spring的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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:rabbit="http://www.springframework.org/schema/rabbit"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
    http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd
    http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd"
    default-autowire="byName">

    <!-- rabbitMQ配置 -->
    <bean id="rabbitConnectionFactory"
      class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <constructor-arg value="192.168.1.11"/>
        <property name="username" value="leo"/>
        <property name="password" value="lee31211"/>
        <property name="channelCacheSize" value="8"/>
        <property name="port" value="5672"></property>
    </bean>
    <rabbit:admin connection-factory="rabbitConnectionFactory"/>

    <rabbit:queue name="test123queue" durable="true" />
    <rabbit:queue name="test321queue" durable="true" />

    <!-- 该处是指将路由leo.pay.topic.exchange与两个队列绑定在一块,也可以在rabbitMq的控制台上手动绑定,手动绑定之后,该处代码可以省略,其实发送端已经绑定过了,也没必要绑定了,所以该代码可以省略 -->
 <!--   <rabbit:topic-exchange name="leo.pay.topic.exchange" xmlns="http://www.springframework.org/schema/rabbit" durable="true"> -->
<!--      <bindings> -->
<!--        <binding queue="test123queue" pattern="test123.*" /> -->
<!--        <binding queue="test321queue" pattern="test321.*" /> -->
<!--      </bindings> -->
<!--    </rabbit:topic-exchange> -->

    <!-- 启动两个队列对应的监听(消费者) -->
    <bean id="detailQueueConsumer" class="com.leo.website.cousumer.DetailQueueConsumer"></bean>
    <bean id="testQueueConsumer" class="com.leo.website.cousumer.TestQueueConsumer"></bean>

    <!-- 将两个队列加入监听容器中,每个队列的监听都对应一个监听器 -->
    <rabbit:listener-container connection-factory="rabbitConnectionFactory" concurrency= "8">
        <rabbit:listener queues="test123queue" ref="detailQueueConsumer" method="onMessage"/>
        <rabbit:listener queues="test321queue" ref="testQueueConsumer" method="onMessage"/>
    </rabbit:listener-container>

</beans>

 

接收端java代码(只列出一个监听,另外一个类似):

public class DetailQueueConsumer implements MessageListener {
    @Override
    public void onMessage(Message message) {
        System.out.println("DetailQueueConsumer: " + new String(message.getBody()));
    }
}

 

转载至 : http://blog.csdn.net/u012204058/article/details/54292888

基于这个基础,我们需要做一定的修改,当接收端关闭时,rabbitMq中待发送消息无法到达,当接收端启动,listener会在启动过程中便已接收到消息进行业务处理,这样存在风险,我们可以做以下改动进行优化

public class MessageReceiver implements MessageListener{
    
    private boolean startFlag = true;
    @Override
    public synchronized void onMessage(Message msg) {
        try{
            //刚启动系统时,延迟30秒后执行
            if(startFlag){
                Thread.sleep(30000);
                startFlag = false;
            }
            System.out.println("topic.serviceMessageClientTempQueue  : " + new String(msg.getBody(), "UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
}

 

posted @ 2017-12-27 17:38  Dino林  阅读(819)  评论(0)    收藏  举报