RabbitMQ工作模式(三)

简介: Publish/Subscribe 订阅模式

一、Publish/Subscribe 订阅模式

订阅模式中多了一个交换机角色

  • P:生产者,不再发送消息给队列,而是发送消息给X(交换机)
  • C:消费者,消息的接收者
  • Queue:接收、缓存消息
  • Exchange:交换机,一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。如何操作,取决于Exchange的类型。常见的类型有:
  • Fanout:广播,将消息交给所有绑定到交换机的队列
  • Direct:定向,将消息交给符合指定路由(routing key)的队列
  • Topic:通配符,将消息交给符合路由模式(routing pattern)的队列
  • 交换机只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与交换机绑定,或者没有符合路由规则的队列,那么消息会丢失。

二、示例

基础代码及工具类全都在第一篇中,需要请查看RabbitMQ工作模式(一)

1、生产者代码

packagecom.cui.producer;
importcom.cui.common.RabbitMqUtils;
importcom.rabbitmq.client.BuiltinExchangeType;
importcom.rabbitmq.client.Channel;
importcom.rabbitmq.client.Connection;
importjava.io.IOException;
publicclassProducer_PubSub {
publicstaticvoidmain(String[] args) throwsIOException {
//获得连接Connectionconnection=RabbitMqUtils.getConnection();
//创建channelChannelchannel=connection.createChannel();
//创建交换机/*** exchange:交换机名称* type:交换机类型*     DIRECT("direct"),定向*     FANOUT("fanout"),广播*     TOPIC("topic"),通配符*     HEADERS("headers");参数匹配* durable:是否持久化* autoDelete:是否自动删除* internal:内部使用。一般是false* arguments:参数* exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments)*/Stringexchange="test_fanout_exchange";
channel.exchangeDeclare(exchange, BuiltinExchangeType.FANOUT, true, false, false, null);
//创建队列StringqueueName1="test_fanout_queue1";
StringqueueName2="test_fanout_queue2";
channel.queueDeclare(queueName1, true, false, false, null);
channel.queueDeclare(queueName2, true, false, false, null);
//绑定交换机和队列,fanout模式下路由设置为空channel.queueBind(queueName1, exchange, "");
channel.queueBind(queueName2, exchange, "");
//发送消息Stringmessage="信息:这是一条fanout模式下的消息";
channel.basicPublish(exchange, "", null, message.getBytes());
//释放资源RabbitMqUtils.close(channel, connection);
    }
}

2、消费者代码

packagecom.cui.consumer;
importcom.cui.common.RabbitMqUtils;
importcom.rabbitmq.client.*;
importjava.io.IOException;
/*** 消费者1 Consumer_PubSub1* 消费者2 Consumer_PubSub2 复制1,注意修改queueName2*/publicclassConsumer_PubSub1 {
publicstaticvoidmain(String[] args) throwsIOException {
Connectionconnection=RabbitMqUtils.getConnection();
Channelchannel=connection.createChannel();
StringqueueName1="test_fanout_queue1";
//接收消息Consumerconsumer=newDefaultConsumer(channel){
@OverridepublicvoidhandleDelivery(StringconsumerTag, Envelopeenvelope, AMQP.BasicPropertiesproperties, byte[] body) throwsIOException {
Stringmessage=newString(body, "UTF-8");
System.out.println("接收到消息:"+message);
System.out.println("将信息打印到控制台");
            }
        };
channel.basicConsume(queueName1, true, consumer);
    }
}

3、小结

  • 订阅模式同一个交换机有多个队列,多个消费者监听各自队列
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
2月前
|
消息中间件
RabbitMQ的 RPC 消息模式你会了吗?
【9月更文挑战第11天】RabbitMQ 的 RPC(远程过程调用)消息模式允许客户端向服务器发送请求并接收响应。其基本原理包括:1) 客户端发送请求,创建回调队列并设置关联标识符;2) 服务器接收请求并发送响应至回调队列;3) 客户端根据关联标识符接收并匹配响应。实现步骤涵盖客户端和服务器的连接、信道创建及请求处理。注意事项包括关联标识符唯一性、回调队列管理、错误处理及性能考虑。RPC 模式适用于构建可靠的分布式应用程序,但需根据需求调整优化。
|
3月前
|
消息中间件 开发者
【RabbitMQ深度解析】Topic交换器与模式匹配:掌握消息路由的艺术!
【8月更文挑战第24天】在消息队列(MQ)体系中,交换器作为核心组件之一负责消息路由。特别是`topic`类型的交换器,它通过模式匹配实现消息的精准分发,适用于发布-订阅模式。不同于直接交换器和扇形交换器,`topic`交换器支持更复杂的路由策略,通过带有通配符(如 * 和 #)的模式字符串来定义队列与交换器间的绑定关系。
65 2
|
3月前
|
消息中间件
RabbitMQ广播模式
RabbitMQ广播模式
55 1
|
3月前
|
消息中间件 应用服务中间件 网络安全
rabbitMQ镜像模式搭建
rabbitMQ镜像模式搭建
|
4月前
|
消息中间件 传感器 负载均衡
消息队列 MQ使用问题之如何配置一主一从的同步复制模式
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
消息队列 MQ使用问题之如何配置一主一从的同步复制模式
|
4月前
|
消息中间件 存储 Kafka
MetaQ/RocketMQ 原理问题之RocketMQ DLedger融合模式的问题如何解决
MetaQ/RocketMQ 原理问题之RocketMQ DLedger融合模式的问题如何解决
|
3月前
|
消息中间件 Java Maven
RabbitMQ通配符模式
RabbitMQ通配符模式
59 0
|
4月前
|
消息中间件 Java Apache
消息队列 MQ使用问题之如何在内外网环境下使用单组节点单副本模式
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 负载均衡 RocketMQ
MetaQ/RocketMQ 原理问题之在广播模式下,RebalanceService工作的问题如何解决
MetaQ/RocketMQ 原理问题之在广播模式下,RebalanceService工作的问题如何解决
|
5月前
|
消息中间件
RabbitMQ配置单活模式队列
RabbitMQ配置单活模式队列
124 0