RabbitMQ 10 header mode

The header mode is determined based on the header information. The sent message can carry some header information (similar to HTTP), and the message queue to be routed can be determined based on these header information.

  1. Define configuration classes.
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.ExchangeBuilder;
import org.springframework.amqp.core.HeadersExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ配置类
 */
@Configuration
public class RabbitMqConfig {
    
    /**
     * 定义交换机,可以很多个
     * @return 交换机对象
     */
    @Bean
    public HeadersExchange headersExchange(){
        return ExchangeBuilder.headersExchange("amq.headers").build();
    }

    /**
     * 定义消息队列
     * @return 消息队列对象
     */
    @Bean
    public Queue headersQueue(){
        return new Queue("headersQueue");
    }
    
    /**
     * 定义绑定关系
     * @return 绑定关系
     */
    @Bean
    public Binding binding(@Qualifier("headersExchange") HeadersExchange exchange,
                           @Qualifier("headersQueue") Queue queue){
        // 将定义的交换机和队列进行绑定
        return BindingBuilder
                // 绑定队列
                .bind(queue)
                // 到交换机
                .to(exchange)
//                .whereAny("a", "b").exist();                              // 这个是只要存在任意一个指定的头部Key就行
//                .whereAny(Collections.singletonMap("a", "b")).match();    // 传入Map也行,批量指定键值对
//                .whereAll("a", "b").exist();                              // 这个是必须存在所有指定的的头部Key
//                .whereAll(Collections.singletonMap("a", "b")).match();    // 传入Map也行,批量指定键值对
                .where("test").matches("hello");                  // 比如我们现在需要消息的头部信息中包含test,并且值为hello才能转发给我们的消息队列
    }
}
  1. Define consumers.
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 头部监听器
 */
@Component
public class HeadersListener {

    /**
     * 监听头部队列消息
     */
    @RabbitListener(queuesToDeclare = {@Queue("headersQueue")})
    public void receiver(String message) {
        System.out.println("头部队列接收到消息:" + message);
    }

}
  1. Define producer.
import org.junit.jupiter.api.Test;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class RabbitMqSpringBootTests {

    /**
     * RabbitTemplate封装了大量的RabbitMQ操作,已经由Starter提供,因此直接注入使用即可
     */
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生产者
     */
    @Test
    void producer()  {
        
        Message message = MessageBuilder.withBody("Hello World".getBytes()).setHeader("test","hello").build();
        rabbitTemplate.convertAndSend("amq.headers", "", message);
    }

}
  1. Start the producer to send messages.

    It can be seen that through header matching, the queue successfully received the message.


Guess you like

Origin blog.csdn.net/qq_37770674/article/details/130051387