消息头订阅,消息发布前,为消息定义一个或多个键值对的消息头,然后消费者接收消息同时需要定义类似的键值对请求头:(如:x-mactch=all或者x_match=any),只有请求头与消息头匹配,才能接收消息,忽略RoutingKey.
配置信息:
package com.lwl.rabbitmq;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import com.lwl.rabbitmq.producer.Producer;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={RabbitmqHeaderApplication.class})
@WebAppConfiguration
public class RabbitmqHeaderApplicationTests {
@Resource
private Producer producer;
/**
* 因为发布的头部里面包含的都满足2个queue ,所以2个queue都可以接收到
*
* 出现错误:Caused by: org.springframework.amqp.AmqpException: No method found for class [B
解决方法: @RabbitListener(queues=queue_name)不需要放在类上。直接注释在方法上就好
*
* @author lwl
* @create 2019年6月17日 上午8:52:22
*/
@Test
public void send() {
Map<String, Object> headerValues = new HashMap<>();
headerValues.put("boot", "boot");
headerValues.put("hello", "hello");
headerValues.put("rabbit", "rabbit");
headerValues.put("mq", "mq");
/**
* 声明消息 (消息体, 消息属性)
*/
MessageProperties messageProperties = new MessageProperties();
// 设置消息是否持久化。Persistent表示持久化,Non-persistent表示不持久化
messageProperties.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);
messageProperties.setContentType("UTF-8");
messageProperties.getHeaders().putAll(headerValues);
Message message = new Message("hello,rabbit_headers_any!".getBytes(), messageProperties);
System.out.println(message.toString());
producer.send(message);
System.out.println("");
System.out.println("---------------------------数据发送成功-------------------------");
System.out.println("");
}
/***
* 虽然2个queue的头部都包含这个headerValues, 但是HEADER_QUEUE_TWO是完全匹配,而HEADER_QUEUE是模糊匹配,所以只有HEADER_QUEUE能接收到数据
* @author lwl
* @create 2019年6月17日 上午8:54:28
*/
@Test
public void send2() {
Map<String, Object> headerValues = new HashMap<>();
headerValues.put("boot", "boot");
headerValues.put("hello", "hello");
headerValues.put("rabbit", "rabbit");
// headerValues.put("mq", "mq");
// headerValues.put("springboot", "springboot");
/**
* 声明消息 (消息体, 消息属性)
*/
MessageProperties messageProperties = new MessageProperties();
// 设置消息是否持久化。Persistent表示持久化,Non-persistent表示不持久化
messageProperties.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);
messageProperties.setContentType("UTF-8");
messageProperties.getHeaders().putAll(headerValues);
Message message = new Message("hello,rabbit_headers_any!".getBytes(), messageProperties);
System.out.println(message.toString());
producer.send(message);
System.out.println("");
System.out.println("---------------------------数据发送成功-------------------------");
System.out.println("");
}
}
生产者:
package com.lwl.rabbitmq.producer;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.lwl.rabbitmq.constant.Constants;
/**
* 生成者
* @author lwl
* @create 2019年6月14日 上午10:56:41
* @version 1.0
*/
@Component
public class Producer {
@Autowired
private AmqpTemplate template;
/**
* 使用主题交换机
* @param message
* @author lwl
* @create 2019年6月14日 上午10:54:54
*/
public void send(Object message){
template.convertAndSend(Constants.HEADER_NAME,null,message);
}
}
消费者:
package com.lwl.rabbitmq.consumer;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.lwl.rabbitmq.constant.Constants;
/**
* 消费者 匹配任意一个
* @author lwl
* @create 2019年6月14日 上午10:57:11
* @version 1.0
*/
@Component
public class HeaderConsumer {
@RabbitListener(queues = Constants.HEADER_QUEUE)
@RabbitHandler
public void process( Message message) {
System.out.println();
System.out.println("-----------------------客户端 1 收到数据 -----------------------");
System.out.println(Constants.HEADER_QUEUE+ " --> Receiver1 : " + message.toString());
System.out.println();
}
}
package com.lwl.rabbitmq.consumer;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.lwl.rabbitmq.constant.Constants;
/**
* 消费者 完全匹配
* @author lwl
* @create 2019年6月14日 上午10:57:11
* @version 1.0
*/
@Component
public class HeaderConsumer3 {
@RabbitListener(queues = Constants.HEADER_QUEUE_TWO)
@RabbitHandler
public void process( Message message) {
System.out.println();
System.out.println("-----------------------客户端 3 收到数据 -----------------------");
System.out.println(Constants.HEADER_QUEUE_TWO+ " --> Receiver3 : " + message.toString());
System.out.println();
}
}
测试用例:
package com.lwl.rabbitmq;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import com.lwl.rabbitmq.producer.Producer;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={RabbitmqHeaderApplication.class})
@WebAppConfiguration
public class RabbitmqHeaderApplicationTests {
@Resource
private Producer producer;
/**
* 因为发布的头部里面包含的都满足2个queue ,所以2个queue都可以接收到
*
* 出现错误:Caused by: org.springframework.amqp.AmqpException: No method found for class [B
解决方法: @RabbitListener(queues=queue_name)不需要放在类上。直接注释在方法上就好
*
* @author lwl
* @create 2019年6月17日 上午8:52:22
*/
@Test
public void send() {
Map<String, Object> headerValues = new HashMap<>();
headerValues.put("boot", "boot");
headerValues.put("hello", "hello");
headerValues.put("rabbit", "rabbit");
headerValues.put("mq", "mq");
/**
* 声明消息 (消息体, 消息属性)
*/
MessageProperties messageProperties = new MessageProperties();
// 设置消息是否持久化。Persistent表示持久化,Non-persistent表示不持久化
messageProperties.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);
messageProperties.setContentType("UTF-8");
messageProperties.getHeaders().putAll(headerValues);
Message message = new Message("hello,rabbit_headers_any!".getBytes(), messageProperties);
System.out.println(message.toString());
producer.send(message);
System.out.println("");
System.out.println("---------------------------数据发送成功-------------------------");
System.out.println("");
}
/***
* 虽然2个queue的头部都包含这个headerValues, 但是HEADER_QUEUE_TWO是完全匹配,而HEADER_QUEUE是模糊匹配,所以只有HEADER_QUEUE能接收到数据
* @author lwl
* @create 2019年6月17日 上午8:54:28
*/
@Test
public void send2() {
Map<String, Object> headerValues = new HashMap<>();
headerValues.put("boot", "boot");
headerValues.put("hello", "hello");
headerValues.put("rabbit", "rabbit");
// headerValues.put("mq", "mq");
// headerValues.put("springboot", "springboot");
/**
* 声明消息 (消息体, 消息属性)
*/
MessageProperties messageProperties = new MessageProperties();
// 设置消息是否持久化。Persistent表示持久化,Non-persistent表示不持久化
messageProperties.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);
messageProperties.setContentType("UTF-8");
messageProperties.getHeaders().putAll(headerValues);
Message message = new Message("hello,rabbit_headers_any!".getBytes(), messageProperties);
System.out.println(message.toString());
producer.send(message);
System.out.println("");
System.out.println("---------------------------数据发送成功-------------------------");
System.out.println("");
}
}