http://www.rabbitmq.com/tutorials/tutorial-three-java.html
发布/订阅
在前面的教程中,我们创建了一个工作队列(work queue)。工作队列是假设每个任务都精确地发送到一个接收者。在这章中,我们将设定一个完全不同的情境:我们将会把一条消息发送给不同的接收者,这被称作:发布/订阅
为了更好地说明本章内容,我们将开发一个简单的日志系统,它有两个小程序组成:一个发布日志信息,另外一个将接收信息被打印出来。
在我们的日志系统中,每一个接收者都能接收到日志信息。这样的话,我们可以将一个接收者接收到的日志保存到硬盘,同时将另外一个接收者的日志打印出来。
从本质上来讲,发布的日志将会发布到所有的接收者。
Exchanges
在前面的教程中,我们通过一个队列来发送和接收消息。现在,我们需要了解清楚Rabbit的完整消息模型。
我们先快速地回顾一下之前的教程内容:
producer 负责发送消息
queue 负责存储消息
consumer 负责接收消息
RabbitMQ的消息模型的关键在于:producer从不直接发送消息到队列 。事实上,一个producer通常根本不知道一个消息将会被发送到哪个队列。
事实上,producer仅仅是将消息发送到一个Exchange。Exchange非常简单,一方面,它负责从producer接收消息,另一方面,它将消息推送给队列。Exchange必须准确地知道如何处理一条消息。是将消息推送给某一个队列,还是同时推送给多个队列,或者直接删除这个消息。这些规则都是根据 exchange type 来定义的。
RabbitMQ有一些内置的 exchange type可以直接使用: direct, topic, headers, fanout。本章我们关注fanout 。我们创建一个fanout类型的exchange,并且命名为logs:
channel.exchangeDeclare("logs","fanout");
fanout类型的exchange非常简单,你从它的名字就可以猜到,它将把消息推送给所有它知道的队列。这正是我们的消息日志系统所需要的。
发布消息:
channel.basicPublish("logs","",null,message.getBytes());
临时队列
在前面的教程中,我们使用队列时,都对队列进行命名。为队列命名对我们来说是非常重要的,因为我们需要在多个produces和consumers之间共享某个队列。
但是在我们的日志系统中却不需要对队列进行命名,因为我们需要接收所有的日志消息,而不仅仅是其中的一部分,我们也仅仅只关注当前的消息,而不是以前的旧的日志信息。为实现这个功能,我们需要做两件事情。
第一:当我们连接到Rabbit时,我们需要一个新的、空的队列。我们可以创建一个随机的队列,或者还有更好的方法,我们可以让服务器为我们随机选择一个队列名称。
第二:一旦我们断开连接,队列应当被自动删除。
在java中,我们可以这个创建一个非持久化的、专用的、能自动删除的随机队列:
String queueName = channel.queueDeclare().getQueue();
绑定
我们已经创建了一个fanout类型的exchange以及一个队列。现在我们需要告诉exchange将接收到的消息发送给我们的队列。这个建立关系的过程叫做绑定。
channel.queueBind(queueName, "logs", "");
分享到:
相关推荐
**一、RabbitMQ基础** 1. **消息中间件**: 消息中间件是分布式系统中的重要组成部分,它允许不同组件之间通过异步通信进行解耦。RabbitMQ作为这样的中间件,负责接收、存储和转发消息。 2. **AMQP协议**: AMQP是一...
你可以开始创建队列、交换机和绑定,实现消息的发布和订阅。记住,RabbitMQ的强大之处在于其灵活性和丰富的插件系统,可以根据具体需求进行定制和扩展。通过持续学习和实践,你可以充分利用RabbitMQ来优化和提升你的...
**RabbitMQ基础** RabbitMQ是一个开源的消息代理和队列服务器,用于在分布式系统中进行消息传递。它是基于AMQP(Advanced Message Queuing Protocol)协议实现的,提供了高可用性、可扩展性和稳定性。RabbitMQ的...
“尚硅谷”的学习笔记提供了关于RabbitMQ的详细教程,涵盖了基础概念、安装配置、实战案例等多个方面,是初学者入门的好资料。此外,官方文档也是深入理解RabbitMQ功能和特性的关键资源,包括了详细的API参考、插件...
RabbitMQ是一个开源的消息...总的来说,这个“rabbitmq学习笔记.zip”文件应该为初学者提供了一个全面了解和掌握RabbitMQ的资源,从基础概念到实践操作,再到高级特性和最佳实践,帮助读者建立起对RabbitMQ的深入理解。
### RabbitMQ基础概念 RabbitMQ 是一个开源的消息代理软件,基于AMQP (Advanced Message Queuing Protocol)标准实现。它提供了多种编程语言的客户端支持,可以部署在分布式系统环境中作为消息中间件使用。RabbitMQ...
### 一、RabbitMQ基础 1. **消息队列原理**:RabbitMQ的核心概念是消息队列,它充当生产者和消费者之间的中介,允许两者异步通信。生产者发送消息到队列,而消费者从队列中接收消息,这样可以解耦系统组件,提高...
"发布/订阅"模式在RabbitMQ中是另一种重要的通信方式。在这个模式下,生产者发布消息到一个主题,而多个订阅者可以监听该主题并接收到消息。这种一对多的关系使得发布/订阅模式适用于广播或通知场景。 "路由"章节...
RabbitMQ是一个基于AMQP(Advanced Message Queuing Protocol)的开源消息代理...在实际应用中,可以根据不同的业务需求选择合适的消息模式,如简单队列、发布/订阅、工作队列、路由、主题等,以实现更灵活的系统设计。
【RabbitMQ学习简单demo项目源码】是一个用于学习RabbitMQ基础概念和使用方法的实战项目。这个项目包含了RabbitMQ的各种模式示例,对于希望通过实践来掌握RabbitMQ的人来说是一个很好的起点。 RabbitMQ是基于AMQP...
**RabbitMQ基础概念与安装** RabbitMQ是一款开源的消息队列系统,它遵循Advanced Message Queuing Protocol (AMQP)标准,用Erlang语言开发,适用于分布式系统中的异步任务处理、解耦以及负载均衡。在本篇学习笔记中...
1. **Simple 简单队列**:这是最基础的模型,一个生产者向队列发布消息,一个或多个消费者从队列中接收消息。消息按FIFO(先进先出)原则处理。 2. **Work Queues(工作队列)**:也称为公平分发,用于多消费者场景...
这是RabbitMQ入门的经典示例,它展示了最基础的消息发布与消费过程。生产者发送一个简单的"Hello, World!"消息到RabbitMQ服务器,然后消费者从队列中取出并打印这个消息。这个例子帮助我们理解RabbitMQ的基本工作...
**RabbitMQ基础与C#应用** RabbitMQ是一款开源的消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,广泛应用于分布式系统中,用于实现异步任务处理、解耦系统组件以及提高系统容错性。在这个...
7. **发布/订阅模式**:学习如何使用主题交换机实现发布/订阅模式,允许多个消费者监听同一主题,实现广播式通信。 8. **延迟队列**:了解如何设置延迟队列,使得消息在特定时间后才被消费,这对于定时任务或者延时...
在实际应用部分,笔记会讲解如何在不同的编程语言(如Java、Python、Node.js等)中集成RabbitMQ,以及如何利用RabbitMQ实现工作队列、发布/订阅模型、RPC(远程过程调用)等常见的消息传递模式。此外,它还会介绍...
RabbitMQ Cookbook中包含的实践配方超过70个,覆盖了从基础到高级的主题,例如消息的发布和订阅、路由、消息持久化、死信队列、工作队列、RPC通信、发布/订阅模式、消息确认机制、权限控制、集群部署和故障转移等。...
1. **RabbitMQ基础** - **AMQP协议**:理解RabbitMQ首先需要了解AMQP,它是跨语言的开放标准,定义了消息传递的规则和格式。 - **节点与集群**:RabbitMQ服务器可以单机运行,也可以组建集群,实现高可用性和负载...
3. **消息发布/订阅模式**:理解生产者如何发布消息到交换器,以及消费者如何订阅队列来获取消息。 4. **工作队列模式**:学习如何使用RabbitMQ实现任务调度,通过多个消费者并行处理任务以提高效率。 5. **路由与...
除了基本的发送和接收消息之外,RabbitMQ 还支持许多高级特性,如工作队列(Work Queues)、发布/订阅模式(Publish/Subscribe)、主题路由(Topic Routing)等。在 "rabbitmqdemo" 中,你可能能够发现这些模式的...