Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / RabbitMQ - Publish/Subscribe in Java

这次我们试试publish / subscribe模式,
也就是将一个消息发送给多个consumer。这里用一个简单的小程序来说明publish / subscribe。
由一个provider提供消息,这个消息会被多个consumer接收。
consumer对同一个消息做出不同的反应,比如打印、保存到文件、数据库什么的。之前的例子可能会给人这种感觉:
producer将消息发送到队列中,消息缓冲在队列中,consumer从队列获得消息。但这并不正确。
在rabbit中,producer从来不会直接将消息发送到队列中。
producer根本无从得知消息是否会发送到某个队列中。事实上,producer只能将消息发送到exchange中。
这么一说虽然感觉多了个东西,但exchange并不复杂。
exchange只是从producer获取消息并将消息推送到队列中。但为什么多了这么个步骤?
比如exchange收到消息后,它应该将消息推送给某个特定的队列? 或者可以将消息推送给多个队列? 再或者直接抛弃该消息?
这些规则取决于exchange的类型。以下是一些可用的exchange type(org.springframework.amqp.core.ExchangeTypes):public static final String DIRECT = "direct"; public static final String TOPIC = "topic"; public static final String FANOUT = "fanout"; public static final String HEADERS = "headers"; public static final String SYSTEM = "system";我们可以用以下方式定义一个exchange:channel.exchangeDeclare("logs", "fanout");正如其名,fanout就是将收到的消息发送给所有可访问的队列。如何查看已定义的exchange?查看已定义的exchange,我们可以用rabbitmqctl list_exchanges命令,如图:图中名为amq.*和没有名字的exchange都是默认自带的。(PS:之前的例子中我们还没有用到exchange的概念,但仍然成功地将消息发送到了队列中。这是因为我们使用的是默认的exchange。)CentOS 5.6 安装RabbitMQ http://www.linuxidc.com/Linux/2013-02/79508.htmRabbitMQ客户端C++安装详细记录 http://www.linuxidc.com/Linux/2012-02/53521.htm用Python尝试RabbitMQ http://www.linuxidc.com/Linux/2011-12/50653.htmRabbitMQ集群环境生产实例部署 http://www.linuxidc.com/Linux/2012-10/72720.htmUbuntu下PHP + RabbitMQ使用 http://www.linuxidc.com/Linux/2010-07/27309.htm在CentOS上安装RabbitMQ流程 http://www.linuxidc.com/Linux/2011-12/49610.htm我们需要将消息发送到指定的exchange中。basicPublish的第一个参数就是exchange的名称(重写的几个都是)。空字符串表示默认的exchange:channel.basicPublish( "logs", "", null, message.getBytes());队列的命名很重要,比如多个worker共享一个队列,producer和consumer的关系用队列名维系。但并不是所有的场景都需要我们亲自去命名。比如我们需要获得所有消息,而不是它的某个子集。或者我们更关心最新的消息,而不是更早放到队列的那些。更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-08/105107p2.htm