Exchange交换机和FanoutExchange交换机一样都是无视key的。
他会根据headers参数来匹配,然后发送消息到相应的消息队列。
匹配规则有两个
- Where Any --头部信息至少有一个匹配
- Where All --头部信息必须完全匹配
下面我们来创建交换机和队列,以及绑定。
@Component
public class HeaderExchange {
@Bean
public Queue queue1(){
return new Queue("testHeaderQueue");
}
@Bean
public HeadersExchange createExchange(){
return new HeadersExchange("testHeaderExchange");
}
@Bean
public Binding bind1(){
HashMap<String, Object> header = new HashMap<>();
header.put("queue", "queue1");
header.put("bindType", "whereAll");
return BindingBuilder.bind(queue1()).to(createExchange()).whereAny(header).match();
}
}
然后发送消息
@RequestMapping("send")
public String testHeaderExchange(String param){
MessageProperties messageProperties = new MessageProperties();
messageProperties.setContentType("text/plain");
messageProperties.setContentEncoding("utf-8");
messageProperties.setHeader("queue","queue1");
Message message = new Message(param.getBytes(), messageProperties);
rabbitTemplate.convertAndSend("testHeaderExchange",null,message);
return "发送成功";
}
再然后就是消费端的代码
@Component
public class TestHeader {
@RabbitListener(queues = "testHeaderQueue")
public void rest(String mes, Message message, Channel channel){
Map<String, Object> headers = message.getMessageProperties().getHeaders();
for (Map.Entry<String, Object> stringObjectEntry : headers.entrySet()) {
System.out.println("key---->"+stringObjectEntry.getKey());
System.out.println("value---->"+stringObjectEntry.getValue());
}
System.out.println("接收到的消息"+mes);
try {
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
} catch (IOException e) {
e.printStackTrace();
}
}
}
我们这边成功接收。
本文参照 此文章