1)引用包
<!-- rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2)配置
spring:
rabbitmq:
host: 192.168.221.129
port: 5673
username: test
password: test
virtual-host: /
// 配置ack方式,我这配置成手动,方便容错重试
listener:
simple:
acknowledge-mode: manual
3)配置主题交换机设置主题
4)配置多个查询并绑定实现但生产多消费
5)代码
@SneakyThrows
@Override
public void run(ApplicationArguments args) {
rabbitProducerTopic("topic测试");
}
/**
* 生产消息
* @param msg 消息
*/
private void rabbitProducerTopic(String msg){
rabbitTemplate.convertAndSend("test.topic","test",msg);
}
/**
* 消费消息1
* @param msg
* @param channel
* @param message
*/
@RabbitHandler
@RabbitListener(queuesToDeclare = @Queue("topic.que"))
private void rabbitTopic(String msg, Channel channel, Message message){
System.out.println("test路由消费者topic:"+msg);
ackMethod(channel,message);
}
/**
* 消费消息2
* @param msg
* @param channel
* @param message
*/
@RabbitHandler
@RabbitListener(queuesToDeclare = @Queue("topic.queall"))
private void rabbitTopicNoRout(String msg, Channel channel, Message message){
System.out.println("无路由消费者topic:"+msg);
ackMethod(channel,message);
}
/**
* 确认消息
* @param channel
* @param message
*/
@SneakyThrows
private void ackMethod(Channel channel, Message message){
channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
}
/**
* 异常消息重试
* @param channel
* @param message
*/
@SneakyThrows
private void nackMethod(Channel channel, Message message){
channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,// false 继续消费,true消息丢失
true);
// 异常阻塞十秒
Thread.sleep(10000);
}
5)其他
* AMQP四种不同的Exchange
标准 | 概念 |
Direct(直连交换机) | 直连交换机的特点是消息队列通过routingKey与交换机进行绑定,相同的routingKey会获得相同的消息。一个队列可以通过多个不同的routingKey与交换机进行绑定。不同的队列也可以通过相同的routingKey绑定交换机。 |
Topic(主题交换机) | 应用范围最广的交换机类型,消息队列通过消息主题与交换机绑定。一个队列可以通过多个主题与交换机绑定,多个消息队列也可以通过相同消息主题和交换机绑定。并且可以通过通配符(*或者#)进行多个消息主题的适配。 消息主题的一般格式为xxx.xxx.xxx(x为英文字母,每个单词用英文句号隔开)。*通配符可以适配一个单词,#可以适配零个或者多个单词。 通配符适配如下:*.xxx.#。此主题可以适配xxx前面只有一个单词后面有零个或者多个单词的所有消息主题。 |
Headers(头交换机) | 与routingKey无关,匹配机制是匹配消息头中的属性信息。在绑定消息队列与交换机之前声明一个map键值对,通过这个map对象实现消息队列和交换机的绑定。当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。 匹配规则x-match有下列两种类型: x-match = all :表示所有的键值对都匹配才能接受到消息 x-match = any :表示只要有键值对匹配就能接受到消息 |
Fanout(扇出交换机) | 扇出交换机的特点是类似于广播,只要队列与该类型的交换机绑定,所有发送到该交换机的信息都会被转发到所有与之绑定的队列,与routingKey无关。 |