spring 异步接收RabbitMQ消息(spring-rabbit)

在Spring框架中使用JMS传递消息有两种方式:JMS template和message listener container,前者用于同步收发消息,后者用于异步收发消息。

本文主要讲述用message listener container异步收发消息。

Spring中有三种方式配置异步消息监听器:实现javax.jms.MessageListener接口、实现Spring的SessionAwareMessageListener和捆绑一个标准POJO到Spring的MessageListenerAdapter类上。这三种方法在消息监听器类结构上不同,但都要用message listener container,message listener container类似JmsTemplate。这三种监听器的使用,在网上有很多资料,咱们下边就说一下另外一种使用方式,不需要实现任何接口的。

spring-rabbit

Maven依赖

<dependency>

    <groupId>org.springframework.amqp</groupId>

    <artifactId>spring-rabbit</artifactId>

    <version>1.6.1.RELEASE</version></dependency>

Java方式实现

spring-rabbit主要API有:

· MessageListenerContainer:监听容器,为消息入队提供异步处理

· RabbitTemplate :用来发送和接收消息

· RabbitAdmin :声明队列、交换器(Exchange)、绑定(Binding)

一般不会使用此方式,就不详细说明了

Spring方式实现

XML配置

<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.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

    <!--配置连接-->
<rabbit:connection-factory id="connectionFactory"
                               host="${rabbitmq.host}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               port="${rabbitmq.port}"
                               requested-heartbeat="20" />

    <!--消息转换器-->
    <bean id="messageConverter" class="com.rabitMq.MessageConverter"/>
    <!--配置RabbitTemplate-->
    <rabbit:template id="amqpTemplate"  message-converter="channelMessageConverter" connection-factory="connectionFactory"/>
    <!--配置RabbitAdmin-->
    <rabbit:admin connection-factory="connectionFactory"/>

    <!--配置队列名-->
    <rabbit:queue name="rabitMq.mq.rabitMqConsumer" />
    <!--自定义监听-->
    <bean id="rabitMqConsumer" class="com.rabitMq.mq.RabitMqConsumer" />
    <!--配置监听-->
    <rabbit:listener-container  message-converter="messageConverter" connection-factory="connectionFactory">
        <rabbit:listener queues="com.rabitMq.mq.RabitMqConsumer" ref="rabitMqConsumer" method="run"/>
    </rabbit:listener-container>


</beans>


监听处理程序

 

/**
 *
 */
package com.rabitMq.mq;



public class RabitMqConsumer {


   public void run(String message) {
      //如果监听程序处理异常了,要进行捕获,否则会出现一直消费的情况,
      try {
         System.out.println(" [x] Received '" + message + "'");
      } catch (Exception e) {

      }
   }
   
}

注意:

RabbitMQ消息监听程序异常时,消费者会向rabbitmq server发送Basic.Reject,表示消息拒绝接受,由于Spring默认requeue-rejected配置为true,消息会重新入队,然后rabbitmq server重新投递,造成了程序一直异常的情况。所以说了这么多,我们通过rabbitmq监听消息的时候,程序一定要添加try…catch语句!!!当然你也可以根据实际情况,选择设置requeue-rejected为false来丢弃消息。

参考:

https://blog.csdn.net/u014513883/article/details/77907898

http://blog.csdn.net/u014513883/article/details/69945078


猜你喜欢

转载自blog.csdn.net/h525483481/article/details/79630116