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("");
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章