在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