RabbitMQ 一二事(2) - 工作队列使用
上篇文章讲了简单队列的使用,这其实就是RMQ给的demo,实际并没有什么用
本篇讲讲工作模式队列,也称之为任务队列
一个生产者发布了多条消息,消费者A可以接受消息,接受消息后该消息就消除,消费者B可以接受其他消息
使用场景,一些数据库操作比较缓慢的话可以分别给多个接口调用,降低压力,或者抢单场景也能考虑,
比如就10个商品,100个消费者来抢单,前10个抢到了后,消息队列就为空了,那么第11个以后的所有消费者都不会抢到

代码示例:
生产者
 public class Send {
     private final static String QUEUE_NAME = "test_queue_work";
     public static void main(String[] argv) throws Exception {
         // 获取到连接以及mq通道
         Connection connection = ConnectionUtil.getConnection();
         Channel channel = connection.createChannel();
         // 声明队列
         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
         for (int i = 0; i < 50; i++) {
             // 消息内容
             String message = "" + i;
             channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
             System.out.println(" [x] Sent '" + message + "'");
             Thread.sleep(i * 10);
         }
         channel.close();
         connection.close();
     }
 }
消费者1
 public class Recv {
     private final static String QUEUE_NAME = "test_queue_work";
     public static void main(String[] argv) throws Exception {
         // 获取到连接以及mq通道
         Connection connection = ConnectionUtil.getConnection();
         Channel channel = connection.createChannel();
         // 声明队列
         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
         // 同一时刻服务器只会发一条消息给消费者, 如果注释了就是指生产者平均分配任务给消费者
         channel.basicQos(1);
         // 定义队列的消费者
         QueueingConsumer consumer = new QueueingConsumer(channel);
         // 监听队列,手动返回完成 设置fasle代表需要手动返回消息的确认状态
         channel.basicConsume(QUEUE_NAME, false, consumer);
         // 获取消息
         while (true) {
             QueueingConsumer.Delivery delivery = consumer.nextDelivery();
             String message = new String(delivery.getBody());
             System.out.println(" [x] Received '" + message + "'");
             // 休眠
             Thread.sleep(10);
             // 手动确认  返回确认状态
             channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
         }
     }
 }
消费者2
 public class Recv2 {
     private final static String QUEUE_NAME = "test_queue_work";
     public static void main(String[] argv) throws Exception {
         // 获取到连接以及mq通道
         Connection connection = ConnectionUtil.getConnection();
         Channel channel = connection.createChannel();
         // 声明队列
         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
         // 同一时刻服务器只会发一条消息给消费者, 如果注释了就是指生产者平均分配任务给消费者
         channel.basicQos(1);
         // 定义队列的消费者
         QueueingConsumer consumer = new QueueingConsumer(channel);
         // 监听队列,手动返回完成状态 设置fasle代表需要手动返回消息的确认状态
         channel.basicConsume(QUEUE_NAME, false, consumer);
         // 获取消息
         while (true) {
             QueueingConsumer.Delivery delivery = consumer.nextDelivery();
             String message = new String(delivery.getBody());
             System.out.println(" [x] Received '" + message + "'");
             // 休眠1秒
             Thread.sleep(1000);
             // 手动确认  返回确认状态
             channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
         }
     }
 }
RabbitMQ 一二事(2) - 工作队列使用的更多相关文章
- RabbitMQ 一二事 - 简单队列使用
		消息队列目前流行的有三种 1. RabbitMQ 2. ActiveMQ 3. Kafka 这三种都非常强大,RabbitMQ目前用的比较多,也比较流行,阿里也在用 ActiveMQ是阿帕奇出品,但是 ... 
- RabbitMQ 一二事(5) - 通配符模式应用
		之前的路由模式是通过key相等来匹配 而通配符,顾名思义,符合条件,则进行消息匹配发送 将路由键和某模式进行匹配.此时队列需要绑定要一个模式上. 符号“#”匹配一个或多个词,符号“*”匹配不多不少一个 ... 
- RabbitMQ 一二事(4) - 路由模式介绍
		路由模式其实和订阅模式差不多,只不过交换机的类型不同而已 路由模式可以用下图来表示,比订阅模式多了一个key,举个栗子就是根据不同的人群来订阅公众号,来收取消息 根据不同的key来获取不同的消息 最简 ... 
- RabbitMQ 一二事(3) - 订阅模式(微信公众号模式)的应用
		之前讲的消费者互相可以把队列中的消息全部读取,但是不是读完整的所有信息 那么采用订阅模式就行,这就是微信公众号的模式, 比如10个人订阅了我的公众号"BeJavaGod",当我发送 ... 
- Hadoop 一二事(1) - 简单介绍与杂谈
		大数据大数据,身边很多朋友都在谈大数据,Big Data!!! 到底是什么,用来干嘛的,也很少有人说得出一二,那今天开始就简单说说这一二事吧 hadoop 的来源:是作者女儿的一个玩具 - 一只黄色的 ... 
- RabbitMQ六种队列模式-工作队列模式
		前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列 [本文]RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ... 
- rabbitmq - java client lib一二事
		由于不可抗因素, 需要给对接方撸一个client的demo.基于比较老的jdk. 所幸找到了这里:http://www.rabbitmq.com/releases/rabbitmq-java-clie ... 
- RabbitMQ (二)工作队列 -摘自网络
		这篇中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务.工作队列的主要任务是:避免立刻执行资源密集型任务,然后必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送给 ... 
- RabbitMQ (两)工作队列
		转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37620057 本系列教程主要来自于官网新手教程的翻译,然后自己进行了部分的改动与 ... 
随机推荐
- 显示所有SAP图标的ABAP代码
			TABLES: icon. INCLUDE <icon>. FIELD-SYMBOLS: <f>. SELECT * FROM icon. ASSIGN (icon-name) ... 
- 滴滴DSRC抢楼大赛,十一快车券飞起来
			十一马上就要到了 不管你想要去哪里 总少不了滴滴打车 DSRC为你准备了30份快车券 现在开始参与抢楼,就有机会得到 活动时间: 本帖发布之时起-9月30日12:00 参与方式: 关注微信公众号“滴滴 ... 
- oracle10g 统计信息查看、收集
			1. 统计信息查看 1.1 单个表的全局统计信息.统计效果查看 2. 统计信息分析(收集) 2.1 分析工具选择 2.2 分析前做index重建 2.3 分析某数据表,可以在PL/SQL的comm ... 
- JDBC编程 之 增删改查
			JDBC编程之数据增加,更改,查询,删除 package com.good.jdbc; import java.sql.Connection; import java.sql.DriverManage ... 
- iOS支付宝集成时遇到的问题整理(2)
			1.集成支付宝SDK编译报错#include<openssl/asn1.h>这一行 “openssl/asn1.h”file not found 解决方法:在BuildSetting 里 ... 
- ASP.NET @Page指令属性(vs2010)
			最近看一篇好文章,摘抄下来. 原文出处:http://www.cnblogs.com/zhaozhan/archive/2010/05/01/1725819.html @Page指令位于每个ASP.N ... 
- [转]Designing a User Interface
			UI design can be divided into three essential elements : functionality, aesthetics, and performance. ... 
- 使用Ant构建struts2 web工程,自动编译,打包成war
			c&c++语言通常使用make脚本来构建和管理自己的工程,同样java也有自己的构建工具(Ant),使用时需要写一个biuld.xml,有点类似c&c++里的makefile. 一.首 ... 
- Erlang 的新数据结构 map 浅析
			更新:文中示例代码直接从Joe的新版 Erlang 书中摘抄而来,其中模式匹配的代码有错误,现已纠正.应该用 := 匹配字段,而不是 => . 即将发布的 Erlang 17 最大变化之一包括新 ... 
- MySql查询语句中解决“该列没有包含在聚合函数或者groupby子句中”的相关问题方法
			首先引入语句来源,表结构和数据如下: 需求是:查出员工(personname)在不同店铺(store)的总薪酬(salary),相同店铺输出store,不同店铺输出multi_store. 正确查询语 ... 
