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






版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《代码大全》读书笔记--开发者测试

开发者测试测试本身并不能改变软件的质量,他只是体现了软件的质量。要想提高软件的质量一方面是通过测试来修改其中发现的问题,另一方面就是开发者在编码之前设计好测试用例,及测试先行。其实,我觉得测试先行最好...

消息队列RabbitMQ与Spring集成

RabbitMQ简介 Spring集成RabbitMQ 1 maven配置 2 rabbmitmq配置文件 3 Spring配置 在Spring中使用RabbitMQ 1 申明一个消息队列Queue ...
  • JaCman
  • JaCman
  • 2015-12-11 11:46
  • 36234

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

下面我们通过一个实例看一下rabbit的使用。 1.实现一个消息监听器ReceiveMessageListener.Java [java] view plain cop...

rabbitmq RPC java实现

使用RabbitMQ来构建一个RPC系统:包含一个客户端和一个RPC服务器。 操作过程 首先定义一个队列名称,如:rpc_queue,服务器声明时队列,客户端发送消息时发送到这个队列,服务...

rabbitmq 连接、通道及线程池说明和配置

bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFacto...

spring rabbitmq 消息确认机制和事务支持

spring rabbitmq 消息确认机制和事务支持

rabbitmq 主题交换机java 实现

主题交换机 扇形(fanout)exchange 会把所有的消息发送到绑定的queue,只是做一个广播。 直连(direct)exchange 把消息发送到绑定的queue 的 routing ke...

spring-amqp 配置实现rabbitmq 路由

示例说明 将主题交换机应用到我们的日志系统中。在开始工作前,我们假设日志的路由键由两个单词组成,路由键看起来是这样的:service.severity代码跟上一篇教程差不多 假设有 order,use...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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