首页 > 其他分享 >Quartz动态设置并发数量

Quartz动态设置并发数量

时间:2022-09-27 16:01:22浏览次数:49  
标签:Quartz 个数 Redis threadCount 并发 quartz 线程 props 动态

  quartz存在一个问题,当正在进行的任务已经达到了设置的个数,后续触发的任务没有线程可用,会导致系统宕机;

  Quartz通过StdSchedulerFactory工厂创建调度器,initialize方法通过解析quartz.properties配置信息进行加载,默认线程个数为10,可以通过覆盖信息定义线程个数,通过Apollo信息进行线程个数配置

            Scheduler scheduler = (new StdSchedulerFactory()).getScheduler();
            //获取Apollo配置信息
            Config config = ConfigService.getConfig("application");
            String threadCount = config.getProperty("org.quartz.threadPool.threadCount", "");
            //对quartz.properties配置信息进行覆盖
            Properties props = new Properties();
            InputStream in = TaskScheduleServiceImpl.class.getClassLoader().getResourceAsStream("quartz.properties");
            props.load(in);
            String threadCountProperties = props.get("org.quartz.threadPool.threadCount").toString();
            if ("".equals(threadCount)) {
                if (!threadCount.equals(threadCountProperties)) {
                    props.setProperty("org.quartz.threadPool.threadCount", threadCount);
                    //重新创建调度器
                    StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
                    stdSchedulerFactory.initialize(props);
                    //关闭原先调度器
                    scheduler.shutdown();
                    scheduler = stdSchedulerFactory.getScheduler();
                    in.close();
                }
            } 

  上面代码是在系统初始化中执行的,若想实现系统运行中进行动态扩容/缩容调度器线程池大小,可以加一个flag标志进行判断,通过获取当前系统正在执行的任务个数和系统定义的总数进行对比,当达到一定个数或一定比例时,再次调用上面代码进行动态扩容/缩容。

  上面代码存在的问题是当关闭调度器时,会杀死原先存在正在进行的任务,这是不友好的操作,可以添加一个中间件(Redis),将每次触发执行的任务加入Redis中,执行完从Redis删除,所以每次系统重启都从Redis读取数据,对任务重新执行,执行完再将其从Redis删除,同时为了保证任务的唯一性(集群环境下不管是定时还是立即执行),需要对任务进行加锁操作,由于只需要保证同一时刻只能有一个任务在运行,保证高可用而不追求强一致性,所以选择的是Redis分布式锁Redisson,根据先到先得策略使用了Redisson的公平锁。

标签:Quartz,个数,Redis,threadCount,并发,quartz,线程,props,动态
From: https://www.cnblogs.com/huangrenhui/p/15500215.html

相关文章

  • 3.实现授权的动态配置
    1.总结:昨天主要是实现了登录的动态配置权限,在我们的配置类中注册一个Hierarchy的bean,自定义FilterInvocationSecurityMetadataSource和AccessDecisionManager类,首......
  • uni-app属性值的动态绑定
    1.问题使用传统的方法给标签的属性动态绑定数据报错。2.错误重现2.1错误代码<imagesrc="{{imgeSrc}}"></image>2.2错误信息ModuleError(from./node_modules......
  • redis 并发写
      全网最新相关内容标题-链接 发布日期 简介 来源 redis并发写数据时解决方案_TebYue的博客-CSDN博客_redis... 2022-3-302:00:3......
  • ABAP-动态下拉框
    1REPORTy4_b4_test40.2TYPE-POOLS:vrm.34DATA:nameTYPEvrm_id.5DATA:numTYPEi."内表判断字段长度的变量67TYPES:BEGINOFwa,8......
  • 开源动态可监控线程池DynamicTp介绍
    前言使用线程池ThreadPoolExecutor过程中你是否有以下痛点呢?代码中创建了一个ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适凭经验设置参数值,上......
  • 【面试题】Vue2动态添加路由 router.addRoute()
    Vue2动态添加路由点击打开视频讲解更加详细场景:一般结合VueX和localstorage一起使用router.addRoutesvue-router4后已废弃:使用router.addRoute()代替。vue-router......
  • 阿里云容器服务 ACK 产品技术动态(202208)
    点击此处即可查看容器服务 ACK 产品详情!......
  • 并发容器
    并发容器1.概述为了线程池做准备,线程池里有一个参数就是用并发容器来做你工作任务的容器。容器分类从物理结构来说,数据结构就两种数组链表从逻辑结构来说,就......
  • axios同时请求多个接口并发
    getmytask(){showFullScreenLoading()constparam={//"status":"All/Going/Plan/Delay/Finish","s......
  • JAVA中的高并发,解决高并发的方案教程 java分布式解决方案
     java高并发,如何解决,什么方式解一、什么是高并发1.1高并发(HighConcurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时......