rabbitmq 与 spring 整合,熟悉 RabbitAdmin、 RabbitTemplate、SimpleMessageListenerContainer、MessageListenerAdapter 和 MessageConverter 几个类(接口)的用法。
代码示例会使用 springboot 项目进行演示
pom 依赖如下:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- json 转换 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
RabbitAdmin
RabbitAdmin 可以用来创建交换机、队列、绑定关系等。当然,这些交换机、队列、绑定关系也可以通过配置文件使用容器进行创建。
首先创建一个主配置类,把 RabbitAdmin 注入容器中,然后就可以直接使用 RabbitAdmin 中的方法了
@Configuration
@ComponentScan({
"com.xiao.*"})
public class RabbitmqConfig {
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
cachingConnectionFactory.setAddresses("192.168.0.125:5672");
cachingConnectionFactory.setUsername("guest");
cachingConnectionFactory.setPassword("guest");
cachingConnectionFactory.setVirtualHost("/");
return cachingConnectionFactory;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
// 该方法的参数必须与上一个bean的方法名相同,否则在容器中无法找到该对象
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
// 必须设置为 true,否则容器不会加载 RabbitAdmin 类
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
}
在测试类中使用 RabbitAdmin 的功能
@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitmqTest {
@Autowired
RabbitAdmin rabbitAdmin;
@Test
public void testRabbitAdmin() {
// 第一种绑定方式
rabbitAdmin.declareExchange(new TopicExchange("admin.topic.exchange", false, false));
rabbitAdmin.declareQueue(new Queue("admin.queue", false, false, false));
//rabbitAdmin.declareBinding(new Binding(destination, destinationType, exchange, routingKey, arguments));
rabbitAdmin.declareBinding(new Binding("admin.queue", Binding.DestinationType.QUEUE, "admin.topic.exchange", "test.#", null));
/*
// 第二种绑定方式
rabbitAdmin.declareBinding(BindingBuilder
.bind(new Queue("admin.queue",false,false,false))
.to(new TopicExchange("admin.topic.exchange", false, false))
.with("builder.#"));
*/
// 清空队列中的消息数据
//rabbitAdmin.purgeQueue(queueName, noWait);
//rabbitAdmin.purgeQueue("admin.queue", false);
}
}
我运行了几次,发现第一种方法可以直接创建交换机和队列,并建立绑定关系,但是第二种方法只能使用已经存在的交换机和队列,如果写不存在的交换机和队列名会报错。
在配置类中通过容器创建交换机、队列和绑定关系,只要在配置类中使用 @Bean 注解即可
@Bean
public TopicExchange exchange1() {
return new TopicExchange("topicExchange001", false, false);
}
@Bean
public Queue queue1() {
return new Queue("queue001", false);
}
@Bean
public Binding binding1() {
return BindingBuilder.bind(queue1()).to(exchange1()).with("bean.#");
}
执行上面的测试方法即可看到 topicExchange001 和 queue001 及绑定关系已经创建了
RabbitTemplate
- RabbitTemplate 与 springAMQP 整合是发送消息的关键类,可以设置消息的属性 MessageProperties
- 该类提供了丰富的发送消息方法,需注入到 spring 容器进行使用
首先需要在配置类中注入 RabbitTemplate 实例,同 RabbitAdmin
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
return rabbitTemplate;
}
测试用例
@Autowired
RabbitTemplate rabbitTemplate;
@Test
public void testRabbitTemplage() {
MessageProperties messageProperties = new MessageProperties();
messageProperties.getHeaders().put("hid", "head id");
messageProperties.getHeaders().put("hfun", "head 功能说明");