Bootstrap

RabbitMQ实战篇:Header - 头部交换机

消息头订阅,消息发布前,为消息定义一个或多个键值对的消息头,然后消费者接收消息同时需要定义类似的键值对请求头:(如: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("");
	}
}

 

;