上篇文章讲了简单队列的使用,这其实就是RMQ给的demo,实际并没有什么用

本篇讲讲工作模式队列,也称之为任务队列

一个生产者发布了多条消息,消费者A可以接受消息,接受消息后该消息就消除,消费者B可以接受其他消息

使用场景,一些数据库操作比较缓慢的话可以分别给多个接口调用,降低压力,或者抢单场景也能考虑,

比如就10个商品,100个消费者来抢单,前10个抢到了后,消息队列就为空了,那么第11个以后的所有消费者都不会抢到

代码示例:

生产者

 1 public class Send {
 2
 3     private final static String QUEUE_NAME = "test_queue_work";
 4
 5     public static void main(String[] argv) throws Exception {
 6         // 获取到连接以及mq通道
 7         Connection connection = ConnectionUtil.getConnection();
 8         Channel channel = connection.createChannel();
 9
10         // 声明队列
11         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
12
13         for (int i = 0; i < 50; i++) {
14             // 消息内容
15             String message = "" + i;
16             channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
17             System.out.println(" [x] Sent '" + message + "'");
18
19             Thread.sleep(i * 10);
20         }
21
22         channel.close();
23         connection.close();
24     }
25 }

消费者1

 1 public class Recv {
 2
 3     private final static String QUEUE_NAME = "test_queue_work";
 4
 5     public static void main(String[] argv) throws Exception {
 6
 7         // 获取到连接以及mq通道
 8         Connection connection = ConnectionUtil.getConnection();
 9         Channel channel = connection.createChannel();
10
11         // 声明队列
12         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
13
14         // 同一时刻服务器只会发一条消息给消费者, 如果注释了就是指生产者平均分配任务给消费者
15         channel.basicQos(1);
16
17         // 定义队列的消费者
18         QueueingConsumer consumer = new QueueingConsumer(channel);
19         // 监听队列,手动返回完成 设置fasle代表需要手动返回消息的确认状态
20         channel.basicConsume(QUEUE_NAME, false, consumer);
21
22         // 获取消息
23         while (true) {
24             QueueingConsumer.Delivery delivery = consumer.nextDelivery();
25             String message = new String(delivery.getBody());
26             System.out.println(" [x] Received '" + message + "'");
27             // 休眠
28             Thread.sleep(10);
29             // 手动确认  返回确认状态
30             channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
31         }
32     }
33 }

消费者2

 1 public class Recv2 {
 2
 3     private final static String QUEUE_NAME = "test_queue_work";
 4
 5     public static void main(String[] argv) throws Exception {
 6
 7         // 获取到连接以及mq通道
 8         Connection connection = ConnectionUtil.getConnection();
 9         Channel channel = connection.createChannel();
10
11         // 声明队列
12         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
13
14         // 同一时刻服务器只会发一条消息给消费者, 如果注释了就是指生产者平均分配任务给消费者
15         channel.basicQos(1);
16
17         // 定义队列的消费者
18         QueueingConsumer consumer = new QueueingConsumer(channel);
19         // 监听队列,手动返回完成状态 设置fasle代表需要手动返回消息的确认状态
20         channel.basicConsume(QUEUE_NAME, false, consumer);
21
22         // 获取消息
23         while (true) {
24             QueueingConsumer.Delivery delivery = consumer.nextDelivery();
25             String message = new String(delivery.getBody());
26             System.out.println(" [x] Received '" + message + "'");
27             // 休眠1秒
28             Thread.sleep(1000);
29             // 手动确认  返回确认状态
30             channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
31         }
32     }
33 }

转载于:https://www.cnblogs.com/leechenxiang/p/5516726.html

RabbitMQ 一二事(2) - 工作队列使用相关推荐

  1. RabbitMQ 一二事 - 简单队列使用

    消息队列目前流行的有三种 1. RabbitMQ 2. ActiveMQ 3. Kafka 这三种都非常强大,RabbitMQ目前用的比较多,也比较流行,阿里也在用 ActiveMQ是阿帕奇出品,但是 ...

  2. RabbitMQ 一二事(4) - 路由模式介绍

    路由模式其实和订阅模式差不多,只不过交换机的类型不同而已 路由模式可以用下图来表示,比订阅模式多了一个key,举个栗子就是根据不同的人群来订阅公众号,来收取消息 根据不同的key来获取不同的消息 最简 ...

  3. RabbitMQ六种队列模式-工作队列模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 [本文] RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  4. python rabitmq_python使用rabbitmq实例二,工作队列

    上一篇介绍了rabbitmq的安装和经典的hello world!实例.这里将对工作队列(Work Queues)做一个了解.因为是接上一篇说明的,所以如果没看过上一篇,看这篇可能会比较难理解.上一篇 ...

  5. 关于在校专利软著申请一二事

    关于在校专利软著申请一二事 (不了解欢迎点进来,精通的也欢迎点进来指点一二) 今天小编想和大家讲一点关于在校专利申请的一些东西 通常一个专利的产生起源有两个: 1. 纯属个人灵感迸发 激发因素一般是: ...

  6. 程序员应该知道的一二事(4)

    程序员应该知道的一二事 科普 开源 脚本 脚本语言和编程语言的区别是什么? 组成原理 先定义后赋值的理由 网络原理 五层 科普 开源 开源即开放源代码. 开放源代码(Open source code) ...

  7. RabbitMQ(二)工作队列

    工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成.相反我们安排任务在之后执行.我们把任务封装为消息并将其发送到队列.在后台运行的工作进程将弹出任务并最终执行作业.当有 ...

  8. RabbitMQ教程C#版 - 工作队列

    先决条件 本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难,可以 ...

  9. 轻松搞定RabbitMQ(二)——工作队列之消息分发机制

    上一篇博文中简单介绍了一下RabbitMQ的基础知识,并写了一个经典语言入门程序--HelloWorld.本篇博文中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务.同样是翻译的 ...

最新文章

  1. matlab 多条函数颜色渐变(没多大用处)
  2. 用yum查询想安装的软件
  3. 【Pygame小游戏】别找了,休闲游戏专题来了丨泡泡龙小程序——休闲游戏研发推荐
  4. tensorflow调用问题解决
  5. Winform自动更新组件分享
  6. python itertool_函数式编程的Python实践(2):Itertool
  7. wget命令---Linux学习笔记
  8. 用我对HTML的点点理解来做个简单的百度首页
  9. php判断字符串里有英文,PHP针对中英文混合字符串长度判断及截取方法示例
  10. eclipse怎么修改java的行高_eclipse皮肤怎么修改 eclipse皮肤修改教程
  11. Error: Cannot create file “D:xampp\xampp-controlin“.拒绝访问。
  12. 又一款性能调优神器,真香!
  13. 网上订餐php论文,php032网上订餐系统
  14. 软件文档写作学习总结——绪论
  15. 【原创】Kinect for windows SDK 入门学习资源合辑
  16. 仙人掌相关问题的处理方法(未完待续)
  17. 疯狂java讲义第七章补充习题第12题答案
  18. Google Earth Engine(GEE)——下载2020-2021年的NDBI
  19. android 翻书动画效果怎么做,android ViewPager实现滑动翻页效果实例代码
  20. 【Vue】实战项目:电商后台管理系统(Element-UI)(一)前后端搭建 - 登录界面 - 主页界面

热门文章

  1. 无限容量数据库架构设计
  2. Linux数据写操作改进
  3. Linux操作系统下查看硬件信息的命令总结
  4. mysql集群之MMM简单搭建
  5. .CN域名总量达1090.6万个:8月份共净增13.8万个
  6. Linux下SSH 客户端不用输入密码配置步骤
  7. 销售员的四大重要素质
  8. md5sum算法 —— linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序
  9. 经典C语言能力测试题(值得一看)
  10. rtp发送 h265