RabbitMQ整合Spring AMQP实战
RabbitAdmin
RabbitAdmin类可以很好的操作RabbitMQ,在Spring中直接进行注入即可。(注意:autoStartup必须要设置为true,否则Spring容器不会加载RabbitAdmin类)
RabbitAdmin底层实现就是从Spring容器中获取Exchange、Bingding、RoutingKey以及Queue的@Bean声明。
然后使用RabbitTemplate的execute方法执行对应的声明、修改、删除等一系列RabbitMQ基础功能操作。例如:添加一个交换机、删除一个绑定、清空一个队列里的消息等等。
pom.xml:加入依赖。
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
RabbitMQConfig:将rabbitAdmin交给spring处理。
@Configuration
public class RabbitMQConfig {
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses("localhost:5672");
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
connectionFactory.setVirtualHost("/");
return connectionFactory;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
}
rabbitAdmin 能够创建交换机、队列、绑定,也提供了清空队列等操作。
@Autowired
private RabbitAdmin rabbitAdmin;
@Test
public void testAdmin() throws Exception {
//创建交换机
rabbitAdmin.declareExchange(new DirectExchange("test.direct", false, false));
rabbitAdmin.declareExchange(new TopicExchange("test.topic", false, false));
rabbitAdmin.declareExchange(new FanoutExchange("test.fanout", false, false));
//创建队列
rabbitAdmin.declareQueue(new Queue("test.direct.queue", false));
rabbitAdmin.declareQueue(new Queue("test.topic.queue", false));
rabbitAdmin.declareQueue(new Queue("test.fanout.queue", false));
//创建绑定
rabbitAdmin.declareBinding(new Binding("test.direct.queue",
Binding.DestinationType.QUEUE, "test.direct", "direct", new HashMap<>()));
rabbitAdmin.declareBinding(BindingBuilder.bind(
new Queue("test.topic.queue", false)) //直接创建队列
.to(new TopicExchange("test.topic", false, false)) //直接创建交换机 建立关联关系
.with("user.#")); //指定路由键
rabbitAdmin.declareBinding(
BindingBuilder.bind(new Queue("test.fanout.queue", false))
.to(new FanoutExchange("test.fanout", false, false)));
//清空队列
rabbitAdmin.purgeQueue("test.topic.queue",false);
}
Spring AMQP 中声明交换机、队列、绑定
使用Spring AMQP只要声明成@Bean 就可以帮我我们自动创建。
/**
* 针对消费者配置
* 1、设置交换机类型
* 2、将队列绑定到交换机
* FanoutExchange: 将消息分发到所有绑定队列,无routingkey的概念
* HeadersExchange: 通过添加属性key-value匹配
* DirectExchange: 按照routingkey分发到指定队列
* TopicExchange: 多关键字匹配
*/
@Bean
public TopicExchange exchange001() {
return new TopicExchange("topic001", true, false);
}
@Bean
public Queue queue001() {
return new Queue("queue001", true);//队列持久
}
@Bean
public Binding binding001() {
return BindingBuilder.bind(queue001()).to(exchange001()).with("spring.*");
}
RabbitTemplate
消息模版,我们在与Spring AMQP整合的时候进行发送消息的关键类。
该类提供了丰富的发送消息方式,包括可靠性投递消息方法、回调监听消息接口ConfirmCallback
、返回值确认接口ReturnCallback
等等。同样我们需要进行注入到Spring容器中,然后直接使用。
在spring中注入RabbitTemplate
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
return rabbitTemplate;
}
使用RabbitTemplate
发送消息
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testSendMessage() throws Exception {
//第一种方式
MessageProperties properties = new MessageProperties();
properties.getHeaders().put("desc", "信息描述..");
properties.getHeaders().put("type", "自定义消息类型..");
Message message = new Message("Hello RabbitMQ".getBytes(), properties);
rabbitTemplate.convertAndSend("topic001", "spring.amqp", message, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
System.err.println("------添加额外的配置--------"