首页 > 系统相关 >另一个Java基于阻塞的定时消费内存队列(依赖guava)

另一个Java基于阻塞的定时消费内存队列(依赖guava)

时间:2024-06-08 17:12:53浏览次数:19  
标签:MAP QueueEnum Java PushType private 内存 guava type final

本文的代码是对一个Java基于阻塞的定时消费内存队列 - Jackie_JK - 博客园 (cnblogs.com)

方法的改进,完善了包装以及部分细节,非jdk21可能需要更换线程池类型。

消费类型:

@Getter
@AllArgsConstructor
public enum PushType {
  ELASTIC,
  SQL,
  ;
}

队列参数枚举:

@Getter
@AllArgsConstructor
public enum QueueEnum {
  A(PushType.SQL, 3000, 2, 200, Duration.of(20, ChronoUnit.SECONDS)),
  B(PushType.SQL, 3000, 2, 200, Duration.of(20, ChronoUnit.SECONDS)),
  C(PushType.SQL, 3000, 2, 200, Duration.of(20, ChronoUnit.SECONDS)),
  D(PushType.SQL, 3000, 2, 200, Duration.of(20, ChronoUnit.SECONDS)),
  ;

  private final PushType pushType;

  //队列长度
  private final int capacity;

  //消费线程数
  private final int threads;

  //单次消费数量
  private final int batchNum;

  //最长阻塞时间
  private final Duration timeout;


}

初始化以及消费方法:

@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class InsertQueue {

  private static final Map<QueueEnum, LinkedBlockingQueue<Object>> TYPE_QUEUE_MAP = new EnumMap<>(QueueEnum.class);

  private static final ExecutorService EXECUTOR_SERVICE = Executors.newVirtualThreadPerTaskExecutor();

  public static <T> void init(QueueEnum type, Consumer<List<T>> task) {
    if (TYPE_QUEUE_MAP.containsKey(type)) {
      throw new IllegalStateException("重复初始化");
    }
    log.info("[" + InsertQueue.class.getSimpleName() + "]" + type + "队列长度" + type.getCapacity());
    TYPE_QUEUE_MAP.put(type, new LinkedBlockingQueue<>(type.getCapacity()));
    for (int i = 0; i < type.getThreads(); i++) {
      EXECUTOR_SERVICE.submit(() -> {
        while (true) {
          try {
            task.accept(pop(type));
          } catch (Exception e) {
            log.error("", e);
          }
        }
      });
    }
  }

  public static boolean push(QueueEnum type, Object obj) {
    LinkedBlockingQueue<Object> blockingQueue = TYPE_QUEUE_MAP.get(type);
    if (blockingQueue == null) {
      throw new IllegalStateException("未初始化");
    }
    return blockingQueue.offer(obj);
  }

  private static <T> List<T> pop(QueueEnum type) throws InterruptedException {
    //拿到batchSize个元素或超过maxWaitTime才返回,返回容器不会为空
    LinkedBlockingQueue<Object> blockingQueue = TYPE_QUEUE_MAP.get(type);
    BlockingQueue<T> queue = (BlockingQueue<T>) blockingQueue;
    List<T> buffer = new ArrayList<>(type.getBatchNum());
    try {
      Queues.drain(queue, buffer, type.getBatchNum(), type.getTimeout());
      return buffer;
    } catch (InterruptedException ex) {
      log.error("[" + InsertQueue.class.getSimpleName() + "]" + type + "队列获取元素中断");
      throw ex;
    }
  }

  public static int getQueueSize(QueueEnum type) {
    return TYPE_QUEUE_MAP.get(type).size();
  }

}

使用前需要调用#init(QueueEnum type, Consumer<List<T>> task)

往后只需要调用#push(QueueEnum type, Object obj) 方法即可

标签:MAP,QueueEnum,Java,PushType,private,内存,guava,type,final
From: https://www.cnblogs.com/JackieJK/p/18238770

相关文章

  • java小记
    今天学了一些计算机存储数据的原理:文本,图片,声音等存储编码:gb2312,Unicode,gbk等等。数据类型相关遇到了一些问题:解决办法大概是:但是对于我来说是无效的,最后还是照着下面来:成功......
  • 【Selenium+java环境配置】(超详细教程常见问题解决)
    Selenium+java环境配置windows电脑环境搭建-chrome浏览器1.下载chrome浏览器2.查看chrome浏览器版本3.下载chrome浏览器驱动4.配置系统环境变量PATH验证环境是否搭建成功1.创建java项目,添加pom文件中添加依赖2.编写代码运行常见问题&解决办法1.访问失败Theversio......
  • Java---异常【详细】
     1.异常的简介1.编译错误:基本语法错误,编译器进行语法检查,如果没有通过,程序违背了计算机编程语言的语法。2.运行错误:程序可以执行,在执行过程中发生异常,导致程序提前退出,没有得到预计的执行效果。3.逻辑错误:程序可能执行,结果不对。4.异常体系,保证程序的健壮性。2.java异......
  • 宝塔搭建javaweb_宝塔工具+javaweb+mysql+tomcat部署项目
    1.首先我们得有一个安装了宝塔工具的云服务器首先我们要在服务器安全组开放宝塔常用的端口,看你是什么服务器,然后对应下面官网的教程就行了。腾讯云:https://www.bt.cn/bbs/thread-1229-1-1.html阿里云:https://www.bt.cn/bbs/thread-2897-1-1.html华为云:https://www.bt.cn/bbs/t......
  • 宝塔搭建javaweb_宝塔工具+javaweb+mysql+tomcat部署项目
    1.首先我们得有一个安装了宝塔工具的云服务器首先我们要在服务器安全组开放宝塔常用的端口,看你是什么服务器,然后对应下面官网的教程就行了。腾讯云:https://www.bt.cn/bbs/thread-1229-1-1.html阿里云:https://www.bt.cn/bbs/thread-2897-1-1.html华为云:https://www.bt.cn/bbs/t......
  • Java——数组排序
     一、排序介绍1、排序的概念排序是将多个数据按照指定的顺序进行排列的过程。2、排序的种类排序可以分为两大类:内部排序和外部排序。3、内部排序和外部排序1)内部排序内部排序是指数据在内存中进行排序,适用于数据量较小的情况。数据可以完全装入内存。常见的内部排序算......
  • Java 集合
    ListArrayList和LinkedList有什么区别?数据结构不同,ArrayList基于数组实现,LinkedList基于双向链表实现使用场景不同,ArrayList用于查多写少的场景,LinkedList多用于写多查少的场景查询:ArrayList支持随机访问,可以通过下标直接获取元素,时间复杂度是O(1)LinkedList需要遍历链表......
  • 【计算机毕业设计】springboot287基于javaEE的校园二手书交易平台的设计与实现
    信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容......
  • minos 1.1 内存虚拟化——hyp
    首发公号:Rand_csminos1.1内存虚拟化——hyp内存虚拟化,目前理解主要两方面:内存管理,没有虚拟化的情况时,对于Linux内核运行在物理硬件之上,内核需要管理物理内存,需要管理进程的虚拟内存。类似,type1类型的hypervisor/minos运行在物理硬件上,minos需要对物理内存管理,需要对......
  • minos 1.2 内存虚拟化——guest
    首发公号:Rand_csminos1.2内存虚拟化——guest项目来自乐敏大佬:https://github.com/minosproject/minos本文继续讲述minos中的内存虚拟化中关于guest的部分,主要弄清楚一个问题,minos如何管理guestvm的内存。对于虚拟机的内存管理主要是ipa的管理,ipa如何映射到......