RabbitMq的四种交换机模式
package cn.chen.miaosha.rabbitmq;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class MQConfig {
public static final String QUEUE = "queue";
public static final String TOPIC_QUEUE1 = "topic.queue1";
public static final String TOPIC_QUEUE2 = "topic.queue2";
public static final String TOPIC_EXCHANGE = "topicExchange";
public static final String ROUTING_KEY1 = "topic.key1";
public static final String ROUTING_KEY2 = "topic.#";
public static final String FANOUTEXCHANGE = "fanoutExchange";
public static final String HEADEREXCHANGE = "headersExchange";
public static final String HEADERS_QUEUE = "headersQueue";
/**
* Direct交换机模式
* @return
*/
@Bean
public Queue queue(){
return new Queue(QUEUE, true);
}
/**
* Topic交换机模式
* @return
*/
@Bean
public Queue topicQueue1(){
return new Queue(TOPIC_QUEUE1, true);
}
@Bean
public Queue topicQueue2(){
return new Queue(TOPIC_QUEUE2, true);
}
@Bean
public TopicExchange topicExchange(){
return new TopicExchange(TOPIC_EXCHANGE);
}
@Bean
public Binding topicBinding1(){
return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with(ROUTING_KEY1);
}
@Bean
public Binding topicBinding2(){
return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with(ROUTING_KEY2);
}
/**
* Fanout模式 交换机exchange
* 广播
*/
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange(FANOUTEXCHANGE);
}
@Bean
public Binding fanoutBinding1(){
return BindingBuilder.bind(topicQueue1()).to(fanoutExchange());
}
@Bean
public Binding fanoutBinding2(){
return BindingBuilder.bind(topicQueue2()).to(fanoutExchange());
}
/**
* Headers模式
*/
@Bean
public HeadersExchange headersExchange(){
return new HeadersExchange(HEADEREXCHANGE);
}
@Bean
public Queue headersQueue(){
return new Queue(HEADERS_QUEUE, true);
}
@Bean
public Binding headerBinding1(){
Map<String, Object> map = new HashMap<>();
map.put("header1", "value1");
map.put("header2", "value2");
return BindingBuilder.bind(topicQueue1()).to(headersExchange()).whereAll(map).match();
}
}
package cn.chen.miaosha.rabbitmq
import cn.chen.miaosha.redis.RedisService
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.amqp.core.AmqpTemplate
import org.springframework.amqp.core.Message
import org.springframework.amqp.core.MessageProperties
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
@Service
public class MQSender {
@Autowired
AmqpTemplate amqpTemplate
public static Logger logger = LoggerFactory.getLogger(MQSender.class)
public void send(Object message){
String msg = RedisService.beanToString(message)
logger.info("send message " + msg)
amqpTemplate.convertAndSend("queue",msg)
}
public void sendTopic(Object message){
String msg = RedisService.beanToString(message)
logger.info("send message " + msg)
amqpTemplate.convertAndSend(MQConfig.TOPIC_EXCHANGE, "topic.key1", msg + "1")
amqpTemplate.convertAndSend(MQConfig.TOPIC_EXCHANGE, "topic.key2", msg + "2")
}
public void sendFanout(Object message){
String msg = RedisService.beanToString(message)
logger.info("send message " + msg)
amqpTemplate.convertAndSend(MQConfig.FANOUTEXCHANGE, "", msg + "1")
}
public void sendHeaders(Object message){
String msg = RedisService.beanToString(message)
logger.info("send message " + msg)
MessageProperties properties = new MessageProperties()
properties.setHeader("header1", "value1")
properties.setHeader("header2", "value2")
Message obj = new Message(msg.getBytes(), properties)
amqpTemplate.convertAndSend(MQConfig.HEADEREXCHANGE, "", obj)
}
}
package cn.chen.miaosha.rabbitmq;
import cn.chen.miaosha.redis.RedisService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
@Service
public class MQReceiver {
public static Logger logger = LoggerFactory.getLogger(MQReceiver.class);
@RabbitListener(queues = MQConfig.QUEUE)
public void receive(String message){
logger.info("receive message " + message);
}
@RabbitListener(queues = MQConfig.TOPIC_QUEUE1)
public void receiveTopic1(String message){
logger.info("topic queue1 message " + message);
}
@RabbitListener(queues = MQConfig.TOPIC_QUEUE2)
public void receiveTopic2(String message){
logger.info("topic queue2 message " + message);
}
@RabbitListener(queues = MQConfig.HEADERS_QUEUE)
public void receiveHeaders(byte[] message){
logger.info("header queue message " + new String(message));
}
}