一、rabbitMQ有三种类型 direct、topic、fanout三种类型
1:direct类型是交换器和路由key完全匹配进行绑定的
例如:
消费端配置:
消费端代码:
@Component
@RabbitListener(bindings=@QueueBinding(
value= @Queue(value="${mq.config.queue.error}",autoDelete="false"),
exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.DIRECT),
key="${my.config.queue.error.routing.key}"
))
public class RabbitMQDirectErrorConsumer {
@RabbitHandler
public void recevier(String msg) {
System.out.println("receiver ===error==========="+msg);
}
}
消息提供端配置:
消息提供端代码:
@Value("${mq.config.direct.exchange}")
private String exchange;
@Autowired
private AmqpTemplate amqpTemplate;
public void sendErrorDirect() {
String msString = "hello" + new Date();
this.amqpTemplate.convertAndSend(exchange,"error.routing.key",msString);//路由key
}
2:topic通过交换器和模糊匹配路由key绑定
例如:
消费端配置:
消费端代码:
1:@Component
@RabbitListener(bindings=@QueueBinding(
value= @Queue(value="${mq.config.queue.debug}",autoDelete="false"),
exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.TOPIC),
key="*.log.debug"
))
public class RabbitMQTopicDebugConsumer {
@RabbitHandler
public void recevier(String msg) {
System.out.println("receiver ===debug==========="+msg);
}
}
2:@Component
@RabbitListener(bindings=@QueueBinding(
value= @Queue(value="${mq.config.queue.logs}",autoDelete="false"),
exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.TOPIC),
key="*.log.*"
))
public class RabbitMQTopicLogsConsumer {
@RabbitHandler
public void recevier(String msg) {
System.out.println("receiver ===all==========="+msg);
}
}
消息提供端配置:
3:fanout 广播机制使用,通过交换器绑定的
例如:
消费端配置:
1、
2、
消息提供端配置:
代码:
不需要路由key值
二、rabbitMQ的持久化
就是将autoDelete="false"
三、rabbitMQ的ack,确认机制
只有消费者正常消费信息了,rabbitMQ才会把队列里面的消息给删除掉,如果消费者再消费信息的时候出现了异常,则会重复无限的发布消息。直到内存泄漏。故在使用的时候要注意
解决方法有2种:
1、在抛出异常的地方用try catach捕获异常
2、在配置文件中如下配置(推荐):
#rabbitMQ重试机制
spring.rabbitmq.listener.simple.retry.enabled=true
#重试默认的次数5
spring.rabbitmq.listener.simple.retry.max-attempts=5