Modo de encabezado RabbitMQ 10

El modo de encabezado se determina en función de la información del encabezado. El mensaje enviado puede contener cierta información del encabezado (similar a HTTP) y la cola de mensajes que se enrutará se puede determinar en función de esta información del encabezado.

  1. Definir clases de configuración.
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. Definir consumidores.
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. Definir productor.
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. Inicie el productor para enviar mensajes.

    Se puede ver que a través de la coincidencia de encabezados, la cola recibió el mensaje con éxito.


Supongo que te gusta

Origin blog.csdn.net/qq_37770674/article/details/130051387
Recomendado
Clasificación