消息頭訂閱,消息發佈前,爲消息定義一個或多個鍵值對的消息頭,然後消費者接收消息同時需要定義類似的鍵值對請求頭:(如: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("");
}
}