RabbitMQ(Java操作工作队列-按劳分配方式)
1 - maven依赖
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.7.2</version>
</dependency>
2 - 生产者
public class Provider {public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.181.133");factory.setPort(5672);factory.setVirtualHost("/ems");factory.setUsername("root");factory.setPassword("root");Connection connection = factory.newConnection();Channel channel = connection.createChannel();/*** 获取队列信息* 参数1:队列名称 (没有自动创建)* 参数2:队列是否持久化* 参数3:线程是否独占队列* 参数4:是否在消费完成后删除数据* 参数5:添加额外数据*/channel.queueDeclare("workqueue", true, false, false, null);for (int i = 0; i < 20; i++) {/*** 发布消息* 参数1:交换机的名称(直连式没有涉及到交换机)* 参数2:发布消息的队列名称* 参数3:额外参数* 参数4:发布的消息(二进制方式)*/channel.basicPublish("","workqueue", null, ("张三" + i).getBytes());}channel.close();connection.close();}
}
3 - 消费者 1 (让消费者1睡眠10ms)
public class Consumer1 {public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.181.133");factory.setVirtualHost("/ems");factory.setPort(5672);factory.setUsername("root");factory.setPassword("root");Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.basicQos(1); // 设置我一次只能处理一个 其它的消息在队列里等着就行 能够完成按捞分配/*** 获取队列:* 参数1:队列的名称* 参数2:是否持久化* 参数3:是否独占队列* 参数4:是否完成消费后删除消息* 参数5:额外参数*/channel.queueDeclare("workqueue", true, false, false , null);/*** 消费消息* 参数1:队列名称* 参数2:消费者完成消费后是否通知rabbitmq删除已被消费消息* 参数3:回调函数(获取消费的消息信息)*/channel.basicConsume("workqueue", false,new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("consumer1 --> " + new String(body));channel.basicAck(envelope.getDeliveryTag(), false); //告诉 rabbitmq 我消费完了 你把记录删除}});}
}
4 - 消费者 2
public class Consumer2 {public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.181.133");factory.setVirtualHost("/ems");factory.setPort(5672);factory.setUsername("root");factory.setPassword("root");Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.basicQos(1); //设置我一次只能处理一个 其它的消息在队列里等着就行 能够完成按捞分配/*** 获取队列:* 参数1:队列的名称* 参数2:是否持久化* 参数3:是否独占队列* 参数4:是否完成消费后删除消息* 参数5:额外参数*/channel.queueDeclare("workqueue", true, false, false , null);/*** 消费消息* 参数1:队列名称* 参数2:消费者完成消费后是否通知rabbitmq删除已被消费消息* 参数3:回调函数(获取消费的消息信息)*/channel.basicConsume("workqueue", false,new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("consumer2 --> "+ new String(body));channel.basicAck(envelope.getDeliveryTag(), false); //告诉rabbitmq我已经消费完成,删除已被消费的数据}});}
}
5 - 测试
1 - 先开启两个消费者
2 - 在启动生产者
查看结果
消费者1
消费者2
由于让消费者1睡眠10ms,这样就完成了按劳分配
RabbitMQ(Java操作工作队列-按劳分配方式)相关推荐
- java 操作 ES 的方式 整理总结
一.操作ES 的方式大题有这么三种 1. TransportClinet客户端 2. REST Client 3. SpringDateES 二.第一种 TransportClinet客户端 首先要讲 ...
- 一文快速回顾 Java 操作数据库的方式-JDBC
前言 数据库的重要性不言而喻,不管是什么系统,什么应用软件,也不管它们是 Windows 上的应用程序,还是 Web 应用程序,存储(持久化)和查询(检索)数据都是核心的功能. 大家学习数据库时,比如 ...
- HRM人力资源系统-Day07-RabbitMQ java操作
RabbitMQ安装 MQ全称为Message Queue,即消息队列. 它也是一个队列,遵循FIFO原则. RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message ...
- 理解Java操作数据库原理
2019独角兽企业重金招聘Python工程师标准>>> 参考:https://blog.csdn.net/xiaozhegaa/article/details/70208646 上面 ...
- java操作excel常用的两种方式
转载自:https://www.cnblogs.com/wangyang108/p/6030420.html Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进 ...
- java操作RabbitMQ
1.创建虚拟主机.交换机.队列 RabbitMQ提供了自己的管理界面,可以通过管理界面来完成VirtualHost.Exchange.queue的创建. 1.1创建VirtualHost 1.2创建交 ...
- Java操作数据库方式(六)DataSource详解
##概述 在java世界里操作数据库有很多方式,在众多方式中除了JDBC外都有DataSource对象. DataSource可以看作数据源,它封装了数据库参数,连接数据库,程序中操作DataSour ...
- Java操作Excel三种方式POI、Hutool、EasyExcel
Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...
- Java操作数据库方式二DBCP使用详解
##概述 DBCP的全称是:DataBase connection pool,翻译是:数据库连接池. 在Java操作数据库方式一JDBC使用详解中说到直接使用JDBC非常消耗资源.为了避免频繁关闭链接 ...
最新文章
- 你知道Redis可以实现延迟队列吗?
- visual c++ 6.0原版_C/C++编程笔记:C语言函数指针的理解与使用,就是这么简单明了!...
- 为开源软件评级—商业就绪分级(BRR)模型
- html+设置img+src属性值,javascript获取、设置修改img的src属性(get/setAttribute)
- Mybatis学习之配置优化
- 一个SAP开发人员的养蚕流水帐
- 面试必备:HashMap底层数据结构?jdk1.8算法优化,hash冲突,扩容等问题
- 有BRT,为啥还建公交港湾
- 第十七篇 --ANDROID DisplayManager 服务解析一
- 解码(五):sws_getContext和sws_scale像素格式和尺寸转换函数详解
- 使用instantclient_11_2和PL/SQL Developer工具包连接oracle 11g远程数据库
- 微软CRM记录列表每页显示超过250个记录解决办法
- class ts 扩展方法_一个class文件到底包含了哪些东西?
- Ubuntu 16.04 利用Sakurafrp工具管理多节点多隧道ID 实现 ssh 内网穿透
- 基于PYNQ-Z2的手写数字识别卷积加速器设计【持续更新】
- Win10下用Strokeit的方法
- Linux系统mysql 查看当前使用的配置文件my.cnf的方法
- 计算机核心期刊论文审回,专家审回一般要多长时间
- 日志打印利器logback的使用和配置
- 微信小程序进度条样式_微信小程序——自定义圆形进度条