zoukankan      html  css  js  c++  java
  • 通过队列实现异步批量处理

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/

    1、问题描述

      最近有一个异步写日志的需求,为了提高效率采用了异步批量插入的方式,大致思路是:有日志产生时存入指定队列,一个线程从队列中批量读取固定数量的日志,同时设置一个超时时间,避免了长时间未产生足够的日志从而不存库的情况。下面的demo模拟了基本流程。

    2、操作方法

      1、引入pom文件

            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>28.1-jre</version>
                <scope>compile</scope>
            </dependency>

      2、代码片段

    package com;
    
    import com.google.common.collect.Queues;
    
    import java.util.ArrayList;
    import java.util.List;  
    import java.util.concurrent.BlockingQueue;  
    import java.util.concurrent.LinkedBlockingQueue;  
    import java.util.concurrent.TimeUnit;  
      
    public class T {
    
        /**
         * 批量存入数量
         */
        private static int NUM_ELEMENTS = 10;
    
        /**
         * 等待超时时间(单位:秒)
         */
        private static int TIME_OUT = 5;
    
        public static void main(String[] args) {
            final BlockingQueue<Long> queue = new LinkedBlockingQueue<Long>();
         //模拟产生日志 new Thread(new Runnable(){ public void run() { long num=1L; while(true) { try { queue.put(num); num++; long time = (long) (Math.random()*1000); Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } } }}).start(); while (true) { try { List<Long> list = new ArrayList<Long>(NUM_ELEMENTS); Queues.drain(queue, list, NUM_ELEMENTS, TIME_OUT, TimeUnit.SECONDS); System.out.println(list+", size:"+list.size());
              //执行存库动作 } catch (InterruptedException e) { e.printStackTrace(); } } } }

      3、执行效果

      console日志,从结果上看和预期结果一致,即有满足指定数量10条的情况,也有满足超时(不够10条的情况)

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], size:10
    [11, 12, 13, 14, 15, 16, 17, 18], size:8
    [19, 20, 21, 22, 23, 24, 25, 26, 27, 28], size:10
    [29, 30, 31, 32, 33, 34, 35, 36, 37], size:9
    [38, 39, 40, 41, 42, 43, 44, 45, 46, 47], size:10
    [48, 49, 50, 51, 52, 53, 54, 55, 56, 57], size:10
    [58, 59, 60, 61, 62, 63, 64, 65, 66, 67], size:10
    [68, 69, 70, 71, 72, 73, 74, 75], size:8
    [76, 77, 78, 79, 80, 81, 82, 83, 84], size:9
    [85, 86, 87, 88, 89, 90, 91, 92, 93, 94], size:10
    [95, 96, 97, 98, 99, 100, 101, 102, 103], size:9
    [104, 105, 106, 107, 108, 109, 110], size:7

    3、参考网站

      http://blog.itpub.net/29254281/viewspace-2120130/

  • 相关阅读:
    微信小程序上拉分页
    关于检测数据类型,三种方法(typeof,instanceof,Object.prototype.toString.call())优缺点
    如何在Devc++中配置OpenCv
    数据库系统和应用
    这是一篇测试文档
    Pandas 表格合并
    es6一些好用的方法总结
    前端面试题
    超有趣! JS是怎么计算1+2!!!
    彻底理解闭包
  • 原文地址:https://www.cnblogs.com/mao2080/p/13815590.html
Copyright © 2011-2022 走看看