目录

基本概念

代码与实例


基本概念

模型如上;

1. 一个生产者,多个消费者;

2. 每个消费者都有自己的队列;

3. 生产者没有直接把消息发送到队列,而是发送到交换机,通过交换机转发到队列;

4. 每个队列都要绑定到交换机上;

5. 生产者发送的消息经过交换机到达队列就能实现一个消息被多个消费者消费;

这里要注意:

1. 在RabbitMQ中交换机没有存储能力,只有队列里面有;

代码与实例

程序运行截图如下:

生产者:

两个消费者:

RabbitMQ相关:

关键源码如下:

RecvX.java

package ps;import com.rabbitmq.client.*;
import util.ConnectionUtils;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Recv1 {private static final String QUEUE_NAME = "test_queue_fanout_sms";private static final String EXCHAGE_NAME = "test_exchange_fanout";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = ConnectionUtils.getConnect();final Channel channel = connection.createChannel();//声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);//绑定到交换机channel.queueBind(QUEUE_NAME, EXCHAGE_NAME, "");channel.basicQos(1);Consumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String msg = new String(body, "utf-8");System.out.println("[1] Recv msg : " + msg);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println("[1] done");channel.basicAck(envelope.getDeliveryTag(), false);}}};boolean autoAck = false;channel.basicConsume(QUEUE_NAME, autoAck, consumer);}
}

Send.java

package ps;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import util.ConnectionUtils;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Send {private static final String EXCHANGE_NAME = "test_exchange_fanout";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = ConnectionUtils.getConnect();Channel channel = connection.createChannel();//声明交换机channel.exchangeDeclare(EXCHANGE_NAME, "fanout");   //并分配String msg = "Hello ps";channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes());System.out.println("Send : " + msg);channel.close();connection.close();}
}

ConnectionUtils.java

package util;import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class ConnectionUtils {public static Connection getConnect() throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();factory.setHost("127.0.0.1");factory.setPort(5672);factory.setVirtualHost("/vhost_cff");factory.setUsername("cff");factory.setPassword("123");return factory.newConnection();}
}

源码下载地址:

https://github.com/fengfanchen/Java/tree/master/PubAndSubRabbitMQ

Java笔记-使用RabbitMQ的Java接口实现Publish/Subscribe(订阅模式)相关推荐

  1. Java笔记-使用RabbitMQ的Java接口实现topic(主题模式)

    目录 基本概念 代码与实例 基本概念 实现的就是官方给出的这个模型: Topic exchange:将路由和某模式匹配 其中 #:匹配一个或多个 *:匹配一个 比如下面要举得这个例子 交换机设置为to ...

  2. Java笔记-使用RabbitMQ的Java接口实现Routing(路由模式)

    目录 基本概念 代码与实例 基本概念 过程图如下: 主要是把交换机设置为直连的方式direct直连的方式然后把 数据 发送给交换机. 交换机再通过路由的Key值转发到队列上. 每一个客户端,都有一个队 ...

  3. Java笔记-使用RabbitMQ的Java接口实现Fair dispatch(公平分发)

    目录 基本概念 代码与实例 基本概念 当某些客户端处理比较强的时候,就多发数据让其处理,当某些客户端处理一般的时候,就少发数据让其处理. 主要是让消费者处理完后,回信息给RabbitMQ,然后Rabb ...

  4. Java笔记-使用RabbitMQ的Java接口实现round-robin(轮询分发)

    目录 基本概念 代码与实例 基本概念 简单队列的不足: 1. 耦合性高: 2. 如果生产者把生产队列该了,消费者也要同时改: Work Queues工作队列,模型如下: 代码与实例 程序运行截图如下: ...

  5. Java笔记-使用RabbitMQ的Java接口生产数据并消费

    目录 基本概念 代码及演示 基本概念 就是官方的这个模型: p为生产者不经过交换机,直接把数据传给消息队列,c为consumer用于消费. 这种结构在本科生的时候,经常自己写,现在用RabbitMQ来 ...

  6. Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)

    Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...

  7. 【RabbitMQ】基础三:发布与订阅模式(Publish/Subscribe)

    [RabbitMQ]基础三:发布与订阅模式(Publish/Subscribe) 1. 订阅模式 2. 发布与订阅模式说明 3. 代码示例 3.1 生产者 3.2 消费者 3.3 测试 4. 总结 1 ...

  8. 9.1-全栈Java笔记: 容器泛型—认识Collection接口

    开发和学习中需要时刻和数据打交道,如果组织这些数据是我们编程中重要的内容. 我们一般通过"容器"来容纳和管理数据.   事实上,数组就是一种容器,可以在其中放置对象或基本类型数据. ...

  9. C/C++笔记-使用RabbitMQ的C接口生产数据并消费

    目录 基本概念 代码与实例 基本概念 使用C语言接口完成官方的这个模型: 很有意思.感觉开源的东西真的好,不用自己去写C/C++服务端. p为生产者不经过交换机,直接把数据传给消息队列,c为consu ...

最新文章

  1. python使用matplotlib可视化跨年数值指标中位数变化率、使用pct_change函数计算变化率、年环比变化率(pct_change function)
  2. html5粒子形成图案,html5 canvas粒子形成下雪背景的效果
  3. WSGI,uWSGI,uwsgi,Nginx
  4. Mysql常用命令详解
  5. spring boot mybatis没有扫描jar中的Mapper接口
  6. PYPL 二月榜单发布:最受欢迎的编程语言、IDE 和数据库都是哪些
  7. python赋值的数组无序怎么办_Python的多维空数组赋值方法
  8. 安卓手机备份_安卓手机数据备份与恢复方法汇总和操作详解
  9. linux系统安装并配置oracle客户端
  10. spring data整合elasticsearch的applicationContext.xml文件模板
  11. 手游图片素材提取_游戏资源提取工具(ExtractData日本游戏看内涵图)V2.5.38.966官方版下载 - 下载吧...
  12. 为什么Word打印预览的跟实际的不一样呢
  13. android系统b181更新包,华为nova 2s官方固件rom刷机包_华为nova2s完整系统升级包
  14. 动易html在线编辑器,动易CMS静态页调用FCK编辑器的代码
  15. Prolog编程学习(一)
  16. java中的Character和char的区别
  17. Android从当前APP跳转到其他应用
  18. 抖音如何快速涨粉?李佳琦涨粉技巧揭秘
  19. 大恒相机标定with MATLAB
  20. easyMock服务搭建及使用

热门文章

  1. 那些没有兴趣花必要的C++时间
  2. 你能打动客户的C++理由,一定要先说服自己相信
  3. C++写的一个聊天室代码,用于XEIM开源即时通讯软件上的
  4. 沟通科技:将引领接入革命第三次浪潮
  5. *printf()格式化串安全漏洞分析(下)
  6. FreeTextBox实现机制
  7. 我们前端忙成狗 人家后端写sql?
  8. 除了要求app随手机壳颜色变之外,产品还要求....
  9. HTML5 API详解(1):fullscreen全屏模式
  10. Cinematic Tracking Title for fcpx(电影自适应伸展效果文字标题)