在RabbitMQ中,producer只能将消息发送到一个exchange中。要理解exchange也非常简单,它一边负责接收producer发送的消息, 另一边将消息推送到queue中。exchange必须清楚的知道在收到消息之后该如何进行下一步的处理,比如是否应该将这条消息发送到某个queue中? 还是应该发送到多个queue中?还是应该直接丢弃这条消息等等。

RabbitMQ中的exchange类型有这么几种:directtopicheaders以及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相关推荐

  1. RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)

    1. simple 模式 simple 模式是最简单最常用的模式 2. work 模式 work 模式有多个消费者 消息产生者将消息放入队列.生产者系统不需知道哪一个任务执行系统在空闲,直接将任务扔到 ...

  2. ZeroMQ之Publish/Subscribe (Java)

    前面的文章介绍了比较简单的Request/Subscribe模式, 这篇文章介绍更为经典的Publish/Subscribe通信模式用来ZeroMQ的实现,其通信方式如下图: 客户端(subscrib ...

  3. 译: 3. RabbitMQ Spring AMQP 之 Publish/Subscribe 发布和订阅

    在第一篇教程中,我们展示了如何使用start.spring.io来利用Spring Initializr创建一个具有RabbitMQ starter dependency的项目来创建spring-am ...

  4. Redis发布与订阅——PUBLISH SUBSCRIBE

    2019独角兽企业重金招聘Python工程师标准>>> Redis发布与订阅--PUBLISH  & SUBSCRIBE 一般来说,发布与订阅(又称pub/sub)的特点是 ...

  5. php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用

    一.场景介绍 最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知.经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低 ...

  6. javascript设计模式——Publish/Subscribe

    推荐阅读http://dev.housetrip.com/2014/09/15/decoupling-javascript-apps-using-pub-sub-pattern/ 我们先引出问题的所在 ...

  7. AKKA 集群中的发布与订阅Distributed Publish Subscribe in Cluster

    Distributed Publish Subscribe in Cluster 基本定义 在单机环境下订阅与发布是很常用的,然而在集群环境是比较麻烦和不好实现的: AKKA已经提供了相应的实现,集群 ...

  8. RabbitMQ发布/订阅模式(Publish/Subscribe)

    工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有 ...

  9. RabbitMQ入门:发布/订阅(Publish/Subscribe)

    在前面的两篇博客中 RabbitMQ入门:Hello RabbitMQ 代码实例 RabbitMQ入门:工作队列(Work Queue) 遇到的实例都是一个消息只发送给一个消费者(工作者),他们的消息 ...

  10. RabbitMQ消息队列:发布/订阅(Publish/Subscribe)

    2019独角兽企业重金招聘Python工程师标准>>> 前面我们把每个Message都是deliver到某个单一的Consumer.今天我们将了解如何把同一个Message deli ...

最新文章

  1. Windows 10下安装Miniconda3
  2. python中try except处理程序异常的三种常用方法
  3. 4、MySQL冷备份所需物理文件
  4. 5G实时直播至关重要的4个原因
  5. android和ios HybridApp的js交互
  6. Gradle之使用Gradle的命令行
  7. 计算机复试考研专业课,2018计算机考研专业课复试复习攻略
  8. java b2b2c shop 多用户商城系统源码-common-service 项目构建过程
  9. 小学校园计算机兴趣小组,小学计算机兴趣小组活动记录文本.doc
  10. 【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel
  11. 全网首发:以管理员身份运行bat,自动切换盘符、目录的正确做法
  12. Atitit 企业6大职能 attilax总结
  13. PMP考试通关宝典,考生必看
  14. mix2线刷开发板救砖_小米MIX 2S手机开不了机_线刷救砖教程_安卓刷机工具_一键刷机...
  15. 【经验分享】基于创龙AM5708多核间通信的IPC例程通用开发流程
  16. 2014微软open day 51CTO讲师、博主、版主~
  17. css3 设置图片变灰(在微信端不能正常) 和透明
  18. 利用计算机开方洋葱数学,他借助“洋葱数学”实现学讲模式
  19. UED设计流程及方法
  20. C# Contract诊断

热门文章

  1. C语言 学生管理系统
  2. 最全面的_Redis_基本操作总结
  3. AutoCAD 2021简体中文版
  4. document.getElementByTagName()的用法
  5. STM32学习笔记之__attribute__ ((at())绝对定位分析
  6. Range在各浏览器下的问题和常见处理办法
  7. 此心拖泥带水,是人生最苦处
  8. RDLC SubReports Exporting to Excel Are Ignored
  9. ScriptManager调用 无参数WebService
  10. G6 2.0 开源发布 -- 裂变·聚变