RabbitMQ--Spring整合

1、生产者

<!--配置connection-factory,指定连接rabbit server参数 -->  
<rabbit:connection-factory id="connectionFactory"  
        host="${rabbit.connect.host}" port="${rabbit.connect.port}" username="${rabbit.connect.username}"  
        password="${rabbit.connect.password}" channel-cache-size="${rabbit.connect.channelCacheSize}"  
        publisher-returns="true" publisher-confirms="true" />  
  
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->  
<rabbit:admin connection-factory="connectionFactory" />  
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" />  
  
    
<!--定义queue  说明:durable:是否持久化; auto_delete: 当所有消费客户端连接断开后,是否自动删除队列; exclusive: 仅创建者可以使用的私有队列,断开后自动删除 -->  
<rabbit:queue name="mq.asdf" durable="true" auto-delete="false" exclusive="false" />  
<rabbit:queue name="mq.asdf2" durable="true" auto-delete="false" exclusive="false" />  
<rabbit:queue name="mq.qwer" durable="true" auto-delete="false" exclusive="false" /> 


<!--定义exchange路由规则,有以下四种路由规则
	fanout-exchange:广播
	topic-exchange:bingingkey 、routingkey模糊匹配
	direct-exchange:bingingkey 、routingkey完全匹配(最常用)
	headers-exchange:根据发送的消息内容中的headers属性进行匹配
-->

<!--定义topic-exchange -->  
<rabbit:topic-exchange name="mq.asdfExChange"  durable="true" auto-delete="false">  
    <rabbit:bindings>  
         <rabbit:binding queue="mq.asdf"  pattern="mq.asdf.send"></rabbit:binding>  
         <rabbit:binding queue="mq.asdf2" pattern="mq.asdf2.send"></rabbit:binding>  
         <rabbit:binding queue="mq.asdf2" pattern="mq.asdf.send"></rabbit:binding>  
    </rabbit:bindings>  
</rabbit:topic-exchange>   
      
<!--定义direct-exchange -->  
<rabbit:direct-exchange name="mq.qwerExChange" durable="true" auto-delete="false">  
    <rabbit:bindings>  
        <rabbit:binding queue="mq.qwer" key="mq.qwer.send" ></rabbit:binding>  
    </rabbit:bindings>  
</rabbit:direct-exchange> 
@Controller  
@RequestMapping("/amqpTest")  
public class AmqpTestController {  
      
    @Autowired  
    private AmqpTemplate amqpTemplate;  
      
      
    @RequestMapping("/sendMsg")  
    @ResponseBody  
    public String sendAmqbMsg(Model model,@RequestParam(value="msg",defaultValue="hello world!!!")String msg){  
        if(model!=null&&!"".equals(msg)){  
	    //void convertAndSend(String exchange, String routingKey, Object message)
            amqpTemplate.convertAndSend("mq.asdfExChange", "mq.asdf.send", msg);  
        }else{  
            amqpTemplate.convertAndSend("mq.asdfExChange", "mq.asdf.send", "hello world");  
        }  
        return "success";  
    }  

    @RequestMapping("/sendMsg2")  
    @ResponseBody  
    public String sendAmqbMsg2(Model model,@RequestParam(value="msg",defaultValue="hello world!!!")String msg){  
        if(model!=null&&!"".equals(msg)){  
            amqpTemplate.convertAndSend("mq.asdfExChange", "mq.asdf2.send", "这个世界很奇妙!!!");  
        }else{  
            amqpTemplate.convertAndSend("mq.asdfExChange", "mq.asdf2.send", "这个世界很奇妙");  
        }  
        return "success";  
    } 
    
    @RequestMapping("/sendMsg3")  
    @ResponseBody  
    public String sendAmqbMsg3(Model model,@RequestParam(value="msg",defaultValue="hello world!!!")String msg){  
        if(model!=null&&!"".equals(msg)){  
            amqpTemplate.convertAndSend("mq.qwerExChange", "mq.qwer.send", "神奇的世界!!!");  
        }else{  
            amqpTemplate.convertAndSend("mq.qwerExChange", "mq.qwer.send", "神奇的世界");  
        }  
        return "success";  
    }  
                     
}

2、消费者

<!--配置connection-factory,指定连接rabbit server参数 -->  
<rabbit:connection-factory id="connectionFactory"  
        host="${rabbit.connect.host}" 
	port="${rabbit.connect.port}" 
	username="${rabbit.connect.username}"  
        password="${rabbit.connect.password}" 
	channel-cache-size="${rabbit.connect.channelCacheSize}"  
        publisher-returns="true"
	publisher-confirms="true" />  
  
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->  
<rabbit:admin connection-factory="connectionFactory" />  


 <!-- 不同'目的地'的消费者对象 --> 
<bean id="asdfConsumer" class="com.demo.action.AsdfConsumer"></bean>  
<bean id="asdfConsumer2" class="com.demo.action.AsdfConsumer2"></bean>  
<bean id="qwerConsumer" class="com.demo.action.QwerConsumer"></bean> 

<!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->  
<rabbit:listener-container connection-factory="connectionFactory" >  
      <rabbit:listener  queues="mq.asdf"  ref="asdfConsumer"/>  
</rabbit:listener-container>  
      
<rabbit:listener-container connection-factory="connectionFactory" >  
      <rabbit:listener  queues="mq.asdf2"  ref="asdfConsumer2"/>  
</rabbit:listener-container>  

<rabbit:listener-container connection-factory="connectionFactory" >  
      <rabbit:listener  queues="mq.qwer"  ref="qwerConsumer"/>  
</rabbit:listener-container>




  <!-- 
    receive-timeout:等待接收超时时长 影响连接创建和销毁
    concurrency:消费者个数
    max-concurrency:最大消费者个数
    min-start-interval:陆续启动  减少并发环境(或是三方系统突然的网络延迟) 大量连接导致的性能耗损
    min-stop-interval:陆续销毁   减少突然的安静 导致大量可用连接被销毁
    min-consecutive-active: 连续N次没有接收发生超时  则认定为需要创建 消费者
    min-consecutive-idle: 连续N次发生了接收超时   则认定消费者需要销毁
    prefetch:每个消费者预读条数 因为异步调用三方 性能瓶颈在网络与三方系统所以预读取条数设置为1(默认为5) 只有一条消息被ACK才会接收下一条消息
    transaction-size:会影响prefetch的数量
    -->
<!-- paycenter.notify.downstream 监听器 监听器各个参数的设置 -->
<rabbit:listener-container connection-factory="connectionFactory"
                               receive-timeout="30000"

                               concurrency="30"
                               max-concurrency="100"
                               min-start-interval="5000"
                               min-stop-interval="60000"
                               min-consecutive-active="2"
                               min-consecutive-idle="2"

                               prefetch="1"
                               transaction-size="1"
                               >
        <rabbit:listener ref="notifyDownStreamConsumer" queue-names="paycenter.notify.downstream" />
</rabbit:listener-container>

public class AsdfConsumer implements MessageListener{   
      
    @Override
    public void onMessage(Message message) {  
        MessageProperties  m=message.getMessageProperties();    
        String msg=  new String (message.getBody());   
        System.out.println("消费掉了:"+msg+"------->>>>>");    
    }  
 
} 

猜你喜欢

转载自blog.csdn.net/wxd_1024/article/details/80535559