rabbitmq 路由spring-amqp rabbit标签实现

原创 2016年08月29日 09:57:01

工程目录:


Recv   消息接收者

Send  消息发送者

MsgHandler  MsgHandlerA     消息处理程序

rabbitmq.properties   rabbitmq 的配置属性

applicationContext-producer.xml    生产者配置

applicationContext-consumer.xml   消费者配置


依赖(spring 依赖未展示):
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-erlang</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>1.6.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-amqp</artifactId>
            <version>1.6.1.RELEASE</version>
        </dependency>

生产者配置:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
       <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />  
       <property name="ignoreResourceNotFound" value="true" />  
       <property name="locations">  
           <list>  
               <!-- rabbitmq配置 -->  
               <value>classpath*:/rabbitmq.properties</value>  
           </list>  
       </property>  
   </bean>

   <!-- 配置连接 -->
   <rabbit:connection-factory id="connectionFactory"  channel-cache-size="2"
                              host="${rabbitmq.host}" password="${rabbitmq.password}" username="${rabbitmq.username}"
                              virtual-host="${rabbitmq.virtualHost}" port="${rabbitmq.port}"/>

   <!--配置消息模板,指定routing-key,用于发送和接收消息,exchange 会根据routing-key 的配置,发送到指定的队列中 -->
   <rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
                    exchange="myExchange" routing-key="foo"/>
   <rabbit:template id="amqpTemplateA" connection-factory="connectionFactory"
                    exchange="myExchange" routing-key="fooA"/>

   <!-- RabbitAdmin 代理,自动声明queue,exchanges和绑定 -->
   <rabbit:admin connection-factory="connectionFactory" />

   <!-- 配置队列,如果不指定出队列名称,则队列名称默认为:"",也是临时队列 -->
   <rabbit:queue id="myQueue" name="${rabbitmq.queue}" auto-delete="${rabbitmq.autoDelete}" durable="${rabbitmq.durable}" exclusive="${rabbitmq.exclusive}" />
   <rabbit:queue id="myQueueA" name="${rabbitmq.queueA}" auto-delete="${rabbitmq.autoDelete}" durable="${rabbitmq.durable}" exclusive="${rabbitmq.exclusive}" />

   <!-- 交换机声明 -->
   <rabbit:direct-exchange name="myExchange" auto-delete="true" durable="false">
       <rabbit:bindings>
           <!-- 指定绑定队列及routing key -->
           <rabbit:binding queue="myQueue"  key="foo"/>
           <rabbit:binding queue="myQueueA" key="fooA"/>
       </rabbit:bindings>
   </rabbit:direct-exchange>

消费者配置:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <!-- rabbitmq配置 -->
            <value>classpath*:/rabbitmq.properties</value>
        </list>
    </property>
</bean>

<!-- 配置连接 -->
<rabbit:connection-factory id="connectionFactory"  channel-cache-size="2"
                           host="${rabbitmq.host}" password="${rabbitmq.password}" username="${rabbitmq.username}"
                           virtual-host="${rabbitmq.virtualHost}" port="${rabbitmq.port}"/>

<!-- RabbitAdmin 代理,自动声明queue,exchanges和绑定 -->
<rabbit:admin connection-factory="connectionFactory" />

<!-- 配置队列,如果不指定出队列名称,则队列名称默认为:"",也是临时队列 -->
<rabbit:queue id="myQueue" name="${rabbitmq.queue}" auto-delete="${rabbitmq.autoDelete}" durable="${rabbitmq.durable}" exclusive="${rabbitmq.exclusive}" />
<rabbit:queue id="myQueueA" name="${rabbitmq.queueA}" auto-delete="${rabbitmq.autoDelete}" durable="${rabbitmq.durable}" exclusive="${rabbitmq.exclusive}" />

<!-- 队列的消息监听器,指定消息处理的类和方法及监听的队列名称
    手动确认,acknowledge="manual"  消息处理要实现ChannelAwareMessageListener 接口实现方法,使用channel 确认消息
-->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual" prefetch="0">
    <rabbit:listener ref="msgHandler" queue-names="${rabbitmq.queue}" />
</rabbit:listener-container>

<!-- 自动确认 -->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto" prefetch="0">
    <rabbit:listener ref="msgHandlerA" method="handleMassage" queue-names="${rabbitmq.queueA}"  />
</rabbit:listener-container>
<!-- 消息处理类 --><bean id="msgHandler" class="com.convict.rabbitmq.spring.MsgHandler" /><bean id="msgHandlerA" class="com.convict.rabbitmq.spring.MsgHandlerA" />

MsgHandler 中处理接收到的消息:

public class MsgHandler  implements ChannelAwareMessageListener {
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        System.out.println("receive message: "+ new String(message.getBody()));
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }
}


public class MsgHandlerA {
    public void handleMassage(String msg){
        System.out.println("routing key is fooA,receive message :"+msg);
    }
}



Recv 直接加载配置,交给spring 管理bean即可:

new ClassPathXmlApplicationContext("applicationContext-consumer.xml");

Send 使用不同模板发送不同的的routing-key消息,exchange 根据不同的routing-key 分发消息到指定的队列

public static void main(String[] args) throws Exception{

    AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-producer.xml");
    //routing key 不同的两个发送消息模板
    RabbitTemplate template = (RabbitTemplate)ctx.getBean("amqpTemplate");
    RabbitTemplate templateA = (RabbitTemplate)ctx.getBean("amqpTemplateA");
    for(int i=0;i<3;i++){
        //发送消息
         template.convertAndSend("Hello World!"+i);
        templateA.convertAndSend("Hello World!"+i);

        Thread.sleep(1000);
        System.out.println("Hello World!"+i);
    }
    ctx.destroy();
}

完整代码:http://download.csdn.net/detail/convict_eva/9617878






HTML5网页标签

标准通用标记语言下的一个应用HTML标准自1999年12月发布的HTML4.01后,后继的HTML5和其它标准被束之高阁,为了推动Web标准化运动的发展,一些公司联合起来,成立了一个叫做 Web Hypertext Application Technology Working Group (Web超文本应用技术工作组 -WHATWG) 的组织。
  • 2018年03月09日 11:41

RabbitMQ注解方式配置说明

RabbitMQ注解方式配置说明1、共通配置 spring-rabbit使用1.6版本,需要spring 4.2以上才可以支持使用注解方式配置 每个项目配置自己的exchange,格式为项目名称简写+...
  • zh350229319
  • zh350229319
  • 2016-08-17 14:34:06
  • 18251

获取rabbitmq的exchange列表和queue列表

安装有rabbitmq_management(web管理插件)访问web首页(一般是localhost:15672)时在首页底部有个httpAPI链接。 该页面列出来了很多API接口 看一下其中的...
  • qq_26656329
  • qq_26656329
  • 2017-08-19 10:28:27
  • 502

spring rabbitmq 动态绑定exchange,routingkey,queue

一般单纯使用spring+rabbitmq或者单独使用rabbitmq时,查看下官网的demo应该问题不大,spring amqp封装rabbitmq之后,初始化, 发送,接收的代码变得更是简洁,只是...
  • johnjobs
  • johnjobs
  • 2015-08-04 23:39:26
  • 11197

RabbitMQ学习之spring配置文件rabbit标签的使用

下面我们通过一个实例看一下rabbit的使用。 1.实现一个消息监听器ReceiveMessageListener.Java [java] view plain cop...
  • itmrchen
  • itmrchen
  • 2016-11-22 14:34:13
  • 4016

spring集成rabbitMq(基于topic和fanout模式)

本文代码样例都是在spring集成环境下写的。 一、rabbitMq的topic模式:图解: 使用场景:发送端不只按固定的routing key发送消息,而是按字符串“匹配”发送,接收端同样如此。...
  • u012204058
  • u012204058
  • 2017-01-09 21:01:00
  • 8078

spring-amqp 配置实现rabbitmq 路由

示例说明 将主题交换机应用到我们的日志系统中。在开始工作前,我们假设日志的路由键由两个单词组成,路由键看起来是这样的:service.severity代码跟上一篇教程差不多 假设有 order,use...
  • convict_eva
  • convict_eva
  • 2016-09-02 16:57:50
  • 2035

spring amqp rabbit 标签使用

  • 2016年08月31日 14:47
  • 9KB
  • 下载

很好的一篇springmvc + rabbitmq 的配置文件

xml version="1.0" encoding="UTF-8"?>  beans xmlns="http://www.springframework.org/schema/beans"     ...
  • xiaoxuelilei
  • xiaoxuelilei
  • 2016-03-21 09:59:31
  • 1309

RabbitMQ demo及其详解

上一章我们简单介绍了RabbitMQ的消息基本路由讲解,这章我们就以demo的方式详细的介绍下。 一、消息代理(RabbitMQ server)配置 代码示例: final stat...
  • qbian
  • qbian
  • 2017-04-12 09:50:37
  • 277
收藏助手
不良信息举报
您举报文章:rabbitmq 路由spring-amqp rabbit标签实现
举报原因:
原因补充:

(最多只允许输入30个字)