RabbitMQ 一二事(2) - 工作队列使用

上篇文章讲了简单队列的使用,这其实就是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 }
时间: 2024-10-07 13:56:28

RabbitMQ 一二事(2) - 工作队列使用的相关文章

RabbitMQ 一二事 - 简单队列使用

消息队列目前流行的有三种 1. RabbitMQ 2. ActiveMQ 3. Kafka 这三种都非常强大,RabbitMQ目前用的比较多,也比较流行,阿里也在用 ActiveMQ是阿帕奇出品,但是性能上和RMQ相比相对差一些 卡夫卡呢,使用场景不同,不多介绍,主要是用于日志收集方面,结合hadoop非常灵活 RabbitMQ官网:http://www.rabbitmq.com/ 安装不多说了,可以下载Windows版本,或者linux版本 下载页面:http://www.rabbitmq.c

RabbitMQ 一二事5 - 通配符模式应用

One-day-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E5%95%86%E5%93%81%E6%88%90%E4%BA%A4%E6%97%B6%E5%8F%91%E9%80%81%E7%9F%AD%E4%BF%A1 ?????O5EWtPoC?^?n?\????? ?????UqwQNtaE????????W?d ????HXzlPeEU4???v??h?? http://auto.315che.com/junjiecross/qa23864614.htm

RabbitMQ 一二事(5) - 通配符模式应用

之前的路由模式是通过key相等来匹配 而通配符,顾名思义,符合条件,则进行消息匹配发送 将路由键和某模式进行匹配.此时队列需要绑定要一个模式上. 符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词. 因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs” 如图: 官网截图: 代码示例: 服务方 接收方1 接受方2 路由模式也是通配符模式的一种 在生产环境中,以通配符模式用的较多 当然简单应用的话路由模式也够了

RabbitMQ 一二事(3) - 订阅模式(微信公众号模式)的应用

之前讲的消费者互相可以把队列中的消息全部读取,但是不是读完整的所有信息 那么采用订阅模式就行,这就是微信公众号的模式, 比如10个人订阅了我的公众号"BeJavaGod",当我发送一条消息的时候, 那么这10个人都能收到我的消息并且查看,比如本条消息,对吧? 生产者制造消息发送给交换机X,而不是发送给队列,队列和交换机绑定,消费者从各自的队列中获得消息 这样则实现一个生产者发送的所有消息都能被所有的消费者同时接收到 需要注意的地方是,在生产者创建消息发送到交换机时,此时没有队列,那么消

回忆一二事

回忆一二事 发表于 2016/02/06 家里养了十几年的玉树没能活过这个冬天. 今年冬天相对前几年很冷,爸爸嫌它太大了,没往屋子里面挪,玉树应该是在最寒风凛冽的那几日,没有坚持住,没等到今天的阳光了. 妈妈在收拾残局,玉树现在早已枯萎,庞大的身躯都耷拉了下来,曾经绿色多肉的叶子都凋成了干.那粗壮的根早已被冻烂,妈妈轻易一揪根就被掰断了.当时还在学校的时候,就让爸爸把玉树搬到屋里.妈妈当时在微信上说,养了这么多年了,像孩子一样.当时看到那行字我的心里也很动容. 是啊,这棵玉树确实陪伴我们很多年,

RabbitMQ(二) ——工作队列

RabbitMQ(二) --工作队列 (转载请附上本文链接--linhxx) 一.概述 工作队列模式(work queue),是有多个消费者的情况下,可以共同消费队列内的内容,加快消息处理速度.这是RabbitMQ的基本工作模式. 二.使用方式 和上一篇中的生产和消费消息的方式一样,就是需要多在cli进程中打开一个消费者的php文件.即需要打开3个php,一个是生产者的php文件,两个消费者的php文件(或多个php文件). 三.工作机制 3.1 轮询(Round-robin dispatchi

RabbitMQ (二)工作队列 -摘自网络

这篇中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务.工作队列的主要任务是:避免立刻执行资源密集型任务,然后必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送给队列.工作进行在后台运行并不断的从队列中取出任务然后执行.当你运行了多个工作进程时,任务队列中的任务将会被工作进程共享执行. 这样的概念在web应用中极其有用,当在很短的HTTP请求间需要执行复杂的任务. 1. 准备 我们使用Thread.sleep来模拟耗时的任务.我们在发送到队列的消息的末尾添加

2. RabbitMQ 之Work Queues (工作队列)

在上一篇揭开RabbitMQ的神秘面纱一文中,我们编写了程序来发送和接收来自命名队列的消息. 本篇我们将会创建一个 Work Queue(工作队列) 来使用分发任务在多个任务中. 前提:本教程假定RabbitMQ 已在标准端口(15672)上的localhost上安装并运行.如果您使用不同的主机,端口或凭据,则需要调整连接设置. 1. Work Queue 工作队列 工作队列(又称:任务队列)背后的主要思想是避免立即执行资源密集型任务,并且必须等待它完成. 相反,我们安排任务稍后完成.我们将任务

RabbitMQ --- Work Queues(工作队列)

目录 RabbitMQ --- Hello Mr.Tua 前言 Work Queues 即工作队列,它表示一个 Producer 对应多个 Consumer,包括两种分发模式:轮循分发(Round-robin)和公平分发(Fair dispatch).旨在为了避免立即执行任务时出现占用很多资源和时间却又必须等待完成的现象. 原理分析: Producer 把工作任务转化为消息发送给队列,当后台有一个 Consumer 进程在运行时,它会不间断地从队列中取出消息来执行:当后台有多个 Consumer