目录
传统Spring中使用RabbitMQ
传统Spring中使用RabbitMQ
1.导入依赖
<!-- RabbitMQ中间消息件 -->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-amqp</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.7.3</version>
</dependency>
<!-- 依赖Spring context等等,所以如果使用RabbitMQ,Spring也应该使用对应版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
2.rabbitmq-config.properties配置文件
#主机地址
mq.host=127.0.0.1
#虚拟主机用户名
mq.username=test
#密码
mq.password=123456
#端口号
mq.port=5672
#虚拟主机名
mq.virtualHost=/rabbit
#队列名
mq.queue=rabbitmq_test
#交换机名
mq.exchange=rabbitmq_exchange
3.applicationContext-rabbitmq.xml
<!-- 连接配置 -->
<rabbit:connection-factory id="connectionFactory" host="${mq.host}" username="${mq.username}" password="${mq.password}" port="${mq.port}" virtual-host="${mq.virtualHost}" />
<rabbit:admin connection-factory="connectionFactory" />
<!-- 消息对象json转换类 -->
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />
<!-- spring AmqpTemplate声明 -->
<rabbit:template exchange="amqpExchange" id="amqpTemplate" connection-factory="connectionFactory" message-converter="jsonMessageConverter" />
<!-- 申明一个消息队列Queue -->
<rabbit:queue id="queue-name" name="${mq.queue}" durable="true" auto-delete="false" exclusive="false" />
<!-- 交换机定义 -->
<!-- rabbit:direct-exchange定义exchange模式为direct,意思就是消息与一个特定的路由键完全匹配,才会转发 -->
<!-- durable 是否持久化
exclusive 仅创建者可以使用的私有队列,断开后自动删除
auto_delete 当所有消费客户端连接断开后,是否自动删除队列
-->
<rabbit:direct-exchange id="mq-exchange" name="${mq.exchange}" durable="true" auto-delete="false">
<!-- 设置消息queue匹配的key -->
<rabbit:bindings>
<rabbit:binding queue="queue_name" key="test_queue_key" />
</rabbit:bindings>
</rabbit:direct-exchange>
<!-- 监听配置 -->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">
<!--
queues:监听的队列,多个的话用逗号(,)分隔
ref:监听器
-->
<rabbit:listener queues="queue-name" ref="queueListenter" />
</rabbit:listener-container>
<bean id="queueListenter" class="com.my.mq.QueueListenter"/>
4.发送消息接口(Producer,生产者)
// 队列生产者
public interface MQProducer {
// 发送消息到指定队列
public void sendDataToQueue(String queueKey, Object object);
}
5.发送消息接口实现类
@Service
public class MQProducerImpl implements MQProducer {
private final static Logger logger = LoggerFactory.getLogger(MQProducerImpl.class);
@Autowired
private AmqpTemplate amqpTemplate;
@Override
public void sendDataToQueue(String queueKey, Object object) {
try {
amqpTemplate.convertAndSend(queueKey, object);
} catch (Exception e) {
logger.error(e.toString());
}
}
}
convertAndSend:将Java对象转换为消息发送到匹配Key的交换机中Exchange,由于配置了JSON转换,这里是将Java对象转换成JSON字符串的形式
AmqpTemplate
Spring AMQP提供了一个发送和接收消息的操作模板类AmqpTemplate。AmqpTemplate它定义包含了发送和接收消息等的一些基本的操作功能。RabbitTemplate是AmqpTemplate的一个实现。
RabbitTemplate支持消息的确认与返回,为了返回消息,RabbitTemplate需要设置mandatory属性为true,并且CachingConnectionFactory的publisherReturns属性也需要设置为true。返回的消息会根据它注册的RabbitTemplate.ReturnCallback setReturnCallback回调发送到给客户端,一个RabbitTemplate仅能支持一个ReturnCallback
为了确认Confirms消息,CachingConnectionFactory的publisherConfirms属性也需要设置为true,确认的消息会根据它注册的RabbitTemplate.ConfirmCallback setConfirmCallback回调发送到给客户端。一个RabbitTemplate也仅能支持一个ConfirmCallback
6.异步接收消息(消费者,Consumer)
@Component
public class QueueListenter implements MessageListener {
@Override
public void onMessage(Message msg) {
try {
System.out.print(msg.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
7.测试
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext-mq.xml" })
public class TestQueue {
final String queue_key = "test_queue_key";
@Autowired
MQProducer mqProducer;
@Test
public void send() {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("data", "hello,rabbmitmq!");
mqProducer.sendDataToQueue(queue_key, hashMap);
}
}
运行测试程序:Run with JUnit,会发送一条消息到test_queue,监听器监听到消息后,打印出消息