RabbitMQ发布订阅消息的三种方式

RabbitMQ发布订阅消息的三种方式,第1张

Fanout:广播 (会把消息发送到该交换机下绑定的所有队列中) Direct:路由 Topic:话题 Fanout:广播使用步骤:

首先在消息接收springboot微服务项目中创建一个Fanout类型的交换机的配置类;

@Configuration
public class FanoutConfig {
//声明FanoutExchange交换机
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("itcast.fanout");//itcast.fanout为交换机名称
//声明第1个队列
@Bean
public Queue fanoutQueue1(){
return new Queue("fanout.queue1");//fanout.queue1为队列名称
}
//绑定队列1和交换机 
@Bean
public Binding bindingQueue1(Queue fanoutQueue1,FanoutExchange fanoutExchange){
return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
  }
  //声明第2个队列
@Bean
public Queue fanoutQueue2(){
return new Queue("fanout.queue2");
}
//绑定队列1和交换机 
@Bean
public Binding bindingQueue2(Queue fanoutQueue2,FanoutExchange fanoutExchange){
return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
  }
  //有多个消息队列就一次添加即可
}
发送消息到交换机,有交换机把消息发送给旗下绑定的所有队列中;
public void sendFanoutExchange() {
//队列名称
String exchangeName ="itcast.fanout":
String message = "我是个大傻瓜!".
//发送消息,参数分别是:交互机名称、RoutingKey(暂时为空)、消息内容
rabbitTemplate.convertAndSend(exchangeName,"",message);
}
接收消息:
@RabbitListener(queues ="fanout.queue1")
public void listenFanoutQueue1(String msg) {
System.out.println("消费者1接收到Fanout消息:【"+msg+"】");

@RabbitListener(queues ="fanout.queve2")
public void listenFanoutQueue2(String msg) {
System.out.println("消费者2接收到Fanout消息:【"+msg+"】")

Direct:路由可以指定要发送的队列:

需要为每个队列创建一个或多个key,交换机发送消息时根据key来选择要发送到的队列,当然不同的队列可以设置相同的key,这样其实也就实现上面的Fanout广播模式;

实现:
这里用注解的方式生成交换机队列和队列的key并绑定
在接收消息的类中添加如下代码;既是创建也是接受;

@RabbitListener(bindings=@QueueBinding(
value =@Queue(name ="direct.queve1"),
exchange =@Exchange(name ="itcast.direct",type=ExchangeTypes.DIRECT), key = {"red", "blue"}
))
public void listenDirectQueve1(string msg){
System.out.println("消费者接收到direct.queue1的消息:【"+msg+"】");}
发送消息
@Test
public void testSendDirectExchange() {
//交换机名称
String exchangeName ="itcast.direct";
String message = "hello, blue!".//发送消息内容
rabbitTemplate.convertAndSend(exchangeName, "blue", message);}//blue为队列的key,这里是向key是blue的队列发送消息
Topic:话题,该模式和Direct:路由模式相似,

区别在于队列的key在设置多个时每个之间要用点隔开没错是".";
比如:可以为一个队列设置一个:china.news.sports和
usa.news.it
顾名思义就是中国新闻体育和美国新闻it
比如我现在要发送一个新闻不管是中国美国不管是体育还是it都要收到,我就可以这样写发送的key, “#.news.#” #为通配符表示所有的意思;

依然用注解的方式创建爱你队列交换机和队列的key
@RabbitListener(bindings=@QueueBinding(
value = @Queue(name ="topic.queue1"),
exchange = @Exchange(name ="itcast.topic", type = ExchangeTypes.TOPIC), key="china.#"
))//意思是凡是有china可以的消息都能收到
public void listenTopicQueue1(String msg){
System.out.println("消费者接收到topic.queue1的消息:【"+ msg +"】");}
发送消息
@Test
public void testSendTopicExchange(){
//换机名称
String exchangeName ="itcast.topic";
String message ="我是个大傻瓜!";//发消息
rabbitTemplate.convertAndSend(exchangeName, routingKey: "china.news", message);//china.news意思是发送到队列key是china又是news的队列中,上面我们定义接收的key为china.#他就可以接受到
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/742345.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存