1)引用包
-
-
org.springframework.boot -
spring-boot-starter-amqp -
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无关。 |