背景:基于Springboot集成RabbitMQ(一)进行
一、Direct exchange(默认)
每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routingKey)名称与队列名称相同,工作方式类似于单播
1. 交换机和队列配置
package com.zsx.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DirectRabbitConfig {
public final static String DIRECT_EXCHANGE = "directExchange";
public final static String DIRECT_QUEUE1 = "direct.queue1";
@Bean
public Queue directQueue1(){
return new Queue(DIRECT_QUEUE1);
}
@Bean
public DirectExchange directExchange(){
return new DirectExchange(DIRECT_EXCHANGE);
}
@Bean
public Binding binding(Queue directQueue1, DirectExchange directExchange){
return BindingBuilder.bind(directQueue1).to(directExchange).with(DIRECT_QUEUE1);
}
}
2. 消息的生产者
package com.zsx.service;
import com.zsx.config.DirectRabbitConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class DirectSender {
private final static Logger LOGGER = LoggerFactory.getLogger(DirectSender.class);
@Autowired
private AmqpTemplate amqpTemplate;
public void sendDirect() {
String msg = "directMsg";
LOGGER.info("DirectSender.sendDirect send content: " + msg);
amqpTemplate.convertAndSend(DirectRabbitConfig.DIRECT_QUEUE1, msg);
}
}
3. 消息的消费者
package com.zsx.service;
import com.zsx.config.DirectRabbitConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class DirectReceiver {
private final static Logger LOGGER = LoggerFactory.getLogger(DirectReceiver.class);
@RabbitListener(queues = DirectRabbitConfig.DIRECT_QUEUE1)
public void receiveDirect(String msg) {
LOGGER.info("DirectReceiver.receiveDirect received content: " + msg);
}
}
二、Fanout exchange
将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键(routingKey),工作方式类似于广播
1. 交换机和队列配置
package com.zsx.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FanoutRabbitConfig {
public final static String FANOUT_QUEUE1 = "fanout.Queue1";
public final static String FANOUT_QUEUE2 = "fanout.Queue2";
public final static String FANOUT_QUEUE3 = "fanout.Queue3";
public final static String FANOUT_EXCHANGE = "fanoutExchange";
@Bean
public Queue fanoutQueue1() {
return new Queue(FANOUT_QUEUE1);
}
@Bean
public Queue fanoutQueue2() {
return new Queue(FANOUT_QUEUE2);
}
@Bean
public Queue fanoutQueue3() {
return new Queue(FANOUT_QUEUE3);
}
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange(FANOUT_EXCHANGE);
}
@Bean
public Binding bindingExchange1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
}
@Bean
public Binding bindingExchange2(Queue fanoutQueue2, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
}
@Bean
public Binding bindingExchange3(Queue fanoutQueue3, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(fanoutQueue3).to(fanoutExchange);
}
}
2. 消息的生产者
package com.zsx.service;
import com.zsx.config.FanoutRabbitConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class FanoutSender {
private final static Logger LOGGER = LoggerFactory.getLogger(FanoutSender.class);
@Autowired
private AmqpTemplate amqpTemplate;
public void sendFanout() {
String msg = "fanoutMsg";
LOGGER.info("FanoutSender.sendFanout send content: " + msg);
amqpTemplate.convertAndSend(FanoutRabbitConfig.FANOUT_EXCHANGE, "", msg);
}
}
3. 消息的消费者
package com.zsx.service;
import com.zsx.config.FanoutRabbitConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class FanoutReceiver {
private final static Logger LOGGER = LoggerFactory.getLogger(FanoutReceiver.class);
@RabbitListener(queues = FanoutRabbitConfig.FANOUT_QUEUE1)
public void receiveFanout1(String msg) {
LOGGER.info("FanoutReceiver.receiveFanout1 received content: " + msg);
}
@RabbitListener(queues = FanoutRabbitConfig.FANOUT_QUEUE2)
public void receiveFanout2(String msg) {
LOGGER.info("FanoutReceiver.receiveFanout2 received content: " + msg);
}
@RabbitListener(queues = FanoutRabbitConfig.FANOUT_QUEUE3)
public void receiveFanout3(String msg) {
LOGGER.info("FanoutReceiver.receiveFanout3 received content: " + msg);
}
}
三、Topic exchange
通过对消息的路由键(routingKey)和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列,工作方式类似于多播
1. 交换机和队列配置
package com.zsx.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TopicRabbitConfig {
public final static String TOPIC_EXCHANGE = "topicExchange";
public final static String TOPIC_QUEUE = "topic.queue";
public final static String TOPIC_DEV_QUEUE = "topic.dev.queue";
public final static String TOPIC_QUEUES = "topic.queues";
public final static String ROUTING_KEY1 = "topic.queue";
public fina