Java笔记-使用RabbitMQ的Java接口实现round-robin(轮询分发)
目录
基本概念
代码与实例
基本概念
简单队列的不足:
1. 耦合性高;
2. 如果生产者把生产队列该了,消费者也要同时改;
Work Queues工作队列,模型如下:
代码与实例
程序运行截图如下:
生产者:
两个消费者如下:
在源码中,消费者一个是1秒消费一次,一个是2秒消费一次,但从我们知道,RabbitMQ给他轮询分发。平均分配
程序结构如下:
Send.java
package work;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 QUEUE_NAME = "test_work_queue";public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {Connection connection = ConnectionUtils.getConnect();Channel channel = connection.createChannel();//声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);for(int i = 0 ; i < 50; i++){String msg = "Hello World : " + i;System.out.println("send msg : " + msg);channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());Thread.sleep(i * 20);}channel.close();connection.close();}
}
Recv1.java
package work;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_work_queue";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = ConnectionUtils.getConnect();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println("recv1 running");//消费者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("Recv[1] msg is : " + msg);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println("Recv[1] done");}}};channel.basicConsume(QUEUE_NAME, true, consumer);}
}
Recv2.java
package work;import com.rabbitmq.client.*;
import util.ConnectionUtils;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Recv2 {private static final String QUEUE_NAME = "test_work_queue";public static void main(String[] args) throws IOException, TimeoutException {Connection connection = ConnectionUtils.getConnect();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println("recv2 running");//消费者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("Recv[2] msg is : " + msg);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println("Recv[2] done");}}};channel.basicConsume(QUEUE_NAME, true, consumer);}
}
源码打包下载:
https://github.com/fengfanchen/Java/tree/master/WorkQueues
Java笔记-使用RabbitMQ的Java接口实现round-robin(轮询分发)相关推荐
- Java笔记-使用RabbitMQ的Java接口实现topic(主题模式)
目录 基本概念 代码与实例 基本概念 实现的就是官方给出的这个模型: Topic exchange:将路由和某模式匹配 其中 #:匹配一个或多个 *:匹配一个 比如下面要举得这个例子 交换机设置为to ...
- Java笔记-使用RabbitMQ的Java接口实现Routing(路由模式)
目录 基本概念 代码与实例 基本概念 过程图如下: 主要是把交换机设置为直连的方式direct直连的方式然后把 数据 发送给交换机. 交换机再通过路由的Key值转发到队列上. 每一个客户端,都有一个队 ...
- Java笔记-使用RabbitMQ的Java接口实现Publish/Subscribe(订阅模式)
目录 基本概念 代码与实例 基本概念 模型如上: 1. 一个生产者,多个消费者: 2. 每个消费者都有自己的队列: 3. 生产者没有直接把消息发送到队列,而是发送到交换机,通过交换机转发到队列: 4. ...
- Java笔记-使用RabbitMQ的Java接口实现Fair dispatch(公平分发)
目录 基本概念 代码与实例 基本概念 当某些客户端处理比较强的时候,就多发数据让其处理,当某些客户端处理一般的时候,就少发数据让其处理. 主要是让消费者处理完后,回信息给RabbitMQ,然后Rabb ...
- Java笔记-使用RabbitMQ的Java接口生产数据并消费
目录 基本概念 代码及演示 基本概念 就是官方的这个模型: p为生产者不经过交换机,直接把数据传给消息队列,c为consumer用于消费. 这种结构在本科生的时候,经常自己写,现在用RabbitMQ来 ...
- Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)
Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...
- 西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序)
西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485) 西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序) 文章目录 西门子博途V16系列学习笔记S ...
- 9.1-全栈Java笔记: 容器泛型—认识Collection接口
开发和学习中需要时刻和数据打交道,如果组织这些数据是我们编程中重要的内容. 我们一般通过"容器"来容纳和管理数据. 事实上,数组就是一种容器,可以在其中放置对象或基本类型数据. ...
- C/C++笔记-使用RabbitMQ的C接口生产数据并消费
目录 基本概念 代码与实例 基本概念 使用C语言接口完成官方的这个模型: 很有意思.感觉开源的东西真的好,不用自己去写C/C++服务端. p为生产者不经过交换机,直接把数据传给消息队列,c为consu ...
最新文章
- 恐怖的shell命令
- jquery改变css,改变style
- UVALive - 3231 Fair Share(最大流+二分)
- Shell中的if语句中的
- 剑指Offer--青蛙跳台阶引发的一系列问题
- 【Vue 3.0 新特性(一)】源码的组织方式
- 渗透测试入门1之信息收集
- 各大网站猪年新春应景LOGO秀
- UGUI Canvas
- 如何基于 Spark Streaming 构建实时计算平台
- SQL2008用户sa登录失败(错误18456)解决方法
- matlab 三角函数 和差化积,三角函数的和差化积公式
- Common Lisp 超规范(译文):5.数据和控制流
- 【Pytorch】Tensor.contiguous()使用与理解
- 如何让论文中的图进行自动编号
- Win10部分引起鼠标卡顿间歇性失灵的原因
- Python标准库:一些受欢迎的模块
- 主成分回归python实现
- 关于mingw32-make的错误
- python+django+layUI+MySQL搭建4G设备管理平台项目(一)