博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RabbitMQ 一二事(2) - 工作队列使用
阅读量:6148 次
发布时间:2019-06-21

本文共 3270 字,大约阅读时间需要 10 分钟。

上篇文章讲了简单队列的使用,这其实就是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 }

 

转载地址:http://ftqya.baihongyu.com/

你可能感兴趣的文章
JAVA GC
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
9、Dubbo-配置(4)
查看>>
前端第七天
查看>>
图解SSH原理及两种登录方法
查看>>
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
416. Partition Equal Subset Sum
查看>>
Django之FBV与CBV
查看>>
Vue之项目搭建
查看>>
app内部H5测试点总结
查看>>
[TC13761]Mutalisk
查看>>
Data Wrangling文摘:Non-tidy-data
查看>>