交換機根據消息header做出判斷,是否投遞給消費者
## 1.配置
~~~
@Configuration
public class HeaderMQConfig {
@Bean
public Queue headersQueue() {
return new Queue("HEADERS_QUEUE");
}
@Bean
public HeadersExchange headersExchange() {
return new HeadersExchange("HEADERS_EXCHANGE");
}
@Bean
public Binding bingHeadersQueue() {
//map為綁定的規則
Map<String, Object> map = new HashMap<>();
map.put("headers1", "value1");
map.put("headers2", "value2");
//whereAll表示需要滿足所有條件
return BindingBuilder.bind(headersQueue()).to(headersExchange()).whereAll(map).match();
}
}
~~~
whereAll:要求有這兩個header消息,才可以投遞,還有whereAny和where
## 2.producer
生產者要帶這兩個請求頭,否則消息不會被交換機投遞,少一個都不行,根據上邊的配置要求
~~~
@Service
public class HeaderMQSender {
@Autowired
private AmqpTemplate amqpTemplate;
public void send(String message) {
MessageProperties messageProperties = new MessageProperties();
messageProperties.setHeader("headers1", "value1");
messageProperties.setHeader("headers2", "value2");
//要發送的消息,第一個參數為具體的消息字節數組,第二個參數為消息規則
Message msg = new Message(message.getBytes(), messageProperties); //加入類似header的信息
amqpTemplate.convertAndSend("HEADERS_EXCHANGE", "", msg);
}
}
~~~
## 3.consumer
controller
~~~
@GetMapping("/headerExchange/{message}")
public String HeaderExchange(@PathVariable("message") String message) {
headerMQSender.send(message);
return "success";
}
~~~
消費者
~~~
@Service
public class HeaderMQReceiver {
private static final Logger logger = LoggerFactory.getLogger(HeaderMQReceiver.class);
@RabbitListener(queues = "HEADERS_QUEUE")
public void receiveHeadersQueue(byte[] message) {
logger.info("receive : HeadersQueue {}", new String(message));
}
}
~~~
輸出:
```
2022-06-07 17:55:15.647 INFO 3736 --- [ntContainer#0-1] c.t.m.r.service.header.HeaderMQReceiver : receive : HeadersQueue m1
```