zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    关于博客园创始人的心路历程,感触很深!
    Django中的ORM相关操作:F查询,Q查询,事物,ORM执行原生SQL
    在Django中运行脚本文件以及打印出SQL语句。
    Django中的跨表查询,多表查询。
    Django中的ORM介绍,字段以及字段的参数。
    9.2安全的 Web API 与 Web API 2.2 个人帐户
    9.1WebApi的身份验证和授权
    3.1创建项目
    2.4使用属性在 ASP.NET Web API 2 路由创建一个 REST API
    2.3属性在 ASP.NET Web API 2 路由
  • 原文地址:https://www.cnblogs.com/leechenxiang/p/5516726.html
Copyright © 2011-2022 走看看