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)配置主题交换机设置主题

springboot rabbitmq消费者不见了 rabbitmq消费者配置_spring boot

 4)配置多个查询并绑定实现但生产多消费

springboot rabbitmq消费者不见了 rabbitmq消费者配置_消息队列_02

 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无关。