Publish/Subscribe
在RabbitMQ中,producer只能将消息发送到一个exchange
中。要理解exchange也非常简单,它一边负责接收producer发送的消息, 另一边将消息推送到queue中。exchange必须清楚的知道在收到消息之后该如何进行下一步的处理,比如是否应该将这条消息发送到某个queue中? 还是应该发送到多个queue中?还是应该直接丢弃这条消息等等。
RabbitMQ中的exchange类型有这么几种:direct
,topic
,headers
以及fanout
。这一小节将会主要介绍最后一种类型——fanout
。 使用RabbitMQ的client来创建一个fanout
类型的exchange。fanout类型的exchange非常简单,从名字也可以猜测出来,它会向所有的queue广播所有收到的消息。这正是我们的log系统需要的。
package com.rabbitmq.www.publish_subscribe;import com.rabbitmq.client.BuiltinExchangeType; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel;public class EmitLog {private static final String EXCHANGE_NAME = "logs";private final static String HOST_ADDR = "172.18.112.102";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost(HOST_ADDR);Connection connection = factory.newConnection();Channel channel = connection.createChannel();//定义exchange channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);for(int i=0;i<=10;i++){String message = "helloworld"+i;//信息发送给申明的exchangechannel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + message );}channel.close();connection.close();}}
package com.rabbitmq.www.publish_subscribe;import com.rabbitmq.client.*;import java.io.IOException;public class ReceiveLogs {private static final String EXCHANGE_NAME = "logs";private final static String HOST_ADDR = "172.18.112.102";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost(HOST_ADDR);Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);//服务器为创建随机queue提供了一个无参数的queueDeclare()方来来创建一个非持久化的、独有的并且是自动删除的已命名的queue。String queueName = channel.queueDeclare().getQueue();//现在我们需要告诉exchange将消息发送到我们的queue中。 这种exchange和queue的关系称为绑定(binding)。channel.queueBind(queueName, EXCHANGE_NAME, "");System.out.println(" [*] Waiting for messages. To exit press CTRL+C");Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println(" [x] Received '" + message + "'");}};channel.basicConsume(queueName, true, consumer);} }
转载于:https://www.cnblogs.com/woms/p/7040857.html
Publish/Subscribe相关推荐
- RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)
1. simple 模式 simple 模式是最简单最常用的模式 2. work 模式 work 模式有多个消费者 消息产生者将消息放入队列.生产者系统不需知道哪一个任务执行系统在空闲,直接将任务扔到 ...
- ZeroMQ之Publish/Subscribe (Java)
前面的文章介绍了比较简单的Request/Subscribe模式, 这篇文章介绍更为经典的Publish/Subscribe通信模式用来ZeroMQ的实现,其通信方式如下图: 客户端(subscrib ...
- 译: 3. RabbitMQ Spring AMQP 之 Publish/Subscribe 发布和订阅
在第一篇教程中,我们展示了如何使用start.spring.io来利用Spring Initializr创建一个具有RabbitMQ starter dependency的项目来创建spring-am ...
- Redis发布与订阅——PUBLISH SUBSCRIBE
2019独角兽企业重金招聘Python工程师标准>>> Redis发布与订阅--PUBLISH & SUBSCRIBE 一般来说,发布与订阅(又称pub/sub)的特点是 ...
- php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
一.场景介绍 最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知.经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低 ...
- javascript设计模式——Publish/Subscribe
推荐阅读http://dev.housetrip.com/2014/09/15/decoupling-javascript-apps-using-pub-sub-pattern/ 我们先引出问题的所在 ...
- AKKA 集群中的发布与订阅Distributed Publish Subscribe in Cluster
Distributed Publish Subscribe in Cluster 基本定义 在单机环境下订阅与发布是很常用的,然而在集群环境是比较麻烦和不好实现的: AKKA已经提供了相应的实现,集群 ...
- RabbitMQ发布/订阅模式(Publish/Subscribe)
工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有 ...
- RabbitMQ入门:发布/订阅(Publish/Subscribe)
在前面的两篇博客中 RabbitMQ入门:Hello RabbitMQ 代码实例 RabbitMQ入门:工作队列(Work Queue) 遇到的实例都是一个消息只发送给一个消费者(工作者),他们的消息 ...
- RabbitMQ消息队列:发布/订阅(Publish/Subscribe)
2019独角兽企业重金招聘Python工程师标准>>> 前面我们把每个Message都是deliver到某个单一的Consumer.今天我们将了解如何把同一个Message deli ...
最新文章
- Windows 10下安装Miniconda3
- python中try except处理程序异常的三种常用方法
- 4、MySQL冷备份所需物理文件
- 5G实时直播至关重要的4个原因
- android和ios HybridApp的js交互
- Gradle之使用Gradle的命令行
- 计算机复试考研专业课,2018计算机考研专业课复试复习攻略
- java b2b2c shop 多用户商城系统源码-common-service 项目构建过程
- 小学校园计算机兴趣小组,小学计算机兴趣小组活动记录文本.doc
- 【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel
- 全网首发:以管理员身份运行bat,自动切换盘符、目录的正确做法
- Atitit 企业6大职能 attilax总结
- PMP考试通关宝典,考生必看
- mix2线刷开发板救砖_小米MIX 2S手机开不了机_线刷救砖教程_安卓刷机工具_一键刷机...
- 【经验分享】基于创龙AM5708多核间通信的IPC例程通用开发流程
- 2014微软open day 51CTO讲师、博主、版主~
- css3 设置图片变灰(在微信端不能正常) 和透明
- 利用计算机开方洋葱数学,他借助“洋葱数学”实现学讲模式
- UED设计流程及方法
- C# Contract诊断
热门文章
- C语言 学生管理系统
- 最全面的_Redis_基本操作总结
- AutoCAD 2021简体中文版
- document.getElementByTagName()的用法
- STM32学习笔记之__attribute__ ((at())绝对定位分析
- Range在各浏览器下的问题和常见处理办法
- 此心拖泥带水,是人生最苦处
- RDLC SubReports Exporting to Excel Are Ignored
- ScriptManager调用 无参数WebService
- G6 2.0 开源发布 -- 裂变·聚变