RabbitMQ与SpringBoot整合
Springboot 版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
一、生产端(producer)
spring.rabbitmq.addresses=10.39.30.42:5672
spring.rabbitmq.username=fnuser
spring.rabbitmq.password=fnuser
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true
#打开消息return机制 mandatory设为false时,路由失败 broker会直接将消息删除
spring.rabbitmq.template.mandatory=true
1、单元测试
@Test
public void sendMessage() throws Exception {
// rabbitTemplate.setMessageConverter(new JsonMessageConverter());
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
System.err.println("---------confirm机制 当RabbitMQ接受到消息时 触发-------------");
System.err.println("correlationData: " + correlationData);
System.err.println("ack: " + ack);
if(!ack){
System.err.println("原因: " + cause);
System.err.println("异常处理---- 补偿消息入库 等等");
}
System.err.println("-----------------------------------------------------");
}
});
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.err.println("---------消息return机制 消息路由队列失败 触发return监听-------------");
System.err.println("exchange : " + exchange);
System.err.println("routingKey : " + routingKey);
System.err.println("回复码 replyCode : " + replyCode);
System.err.println("回复信息 replyText : " + replyText);
System.err.println("返回的消息 : " + message.toString());
System.err.println("------------------------------------------------------------");
}
});
//User 类 自行编写
User user = new User();
user.setId(1000L);
user.setUsername("zhangsan");
user.setAge(23);
CorrelationData messageId = new CorrelationData(UUID.randomUUID().toString());
//消息转换器 使用json序列化
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
rabbitTemplate.convertAndSend("test.exchange1","test.test",user,messageId);
//此处睡眠 是为了保证监听能够正常运行
Thread.sleep(1000);
}
二、消费端(consumer)
spring.rabbitmq.addresses=10.39.30.42:5672
spring.rabbitmq.username=fnuser
spring.rabbitmq.password=fnuser
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000
1、配置类
@Configurable
@Component
public class RabbitConsumerConfig {
@Bean
public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
#手动签收消息
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
#对消费者进行限流
factory.setConcurrentConsumers(5);
factory.setMaxConcurrentConsumers(10);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
}
}
2、测试用例
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "test.queue1", durable = "true"),
exchange = @Exchange(value = "test.exchange1", durable = "true", type = "topic"),
key = "test.*")
)
@RabbitHandler
public void handleMessage(@Payload User user, Channel channel,@Headers Map<String,Object> headers) throws IOException {
System.err.println("----------消费端------------------");
System.err.println("消息: " + user);
Long deliveryTag = (Long)headers.get(AmqpHeaders.DELIVERY_TAG);
channel.basicAck(deliveryTag, true);
}
@Test
public void test() throws IOException {
//保证测试用例 一直运行
System.in.read();
}