监控ThreadPoolExecutor具体Task在Queue中等待时间

可监控_ThreadPoolExecutor

  • 主要关心的问题:

    * 最关心的监控数据:
    * 1.task队列中等待时间
    * 2.task任务执行时间
    *
    *  两种方案:
    * 1. future_task
    * 2. queue
    * 注意:Config-自动获取配置文件注解(后面有时间写)
    
  • 处理:

    • 继承,初始化构造方法

      private static MonitoringLinkedBlockingQueue monitoringQueue = new MonitoringLinkedBlockingQueue(maxQueueSize);
      
      public MonitoringThreadPoolExecutor() {
          super(CPU_PROCESSOR_NUM << 1, CPU_PROCESSOR_NUM << 2, 50, TimeUnit.SECONDS,
                  monitoringQueue,
                  new NamedThreadFactory(THREAD_FACTORY_NAME, false), new RejectedExecutionHandler() {
                      @Override
                      public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                          Monitor.recordOne("monitoring_thread_poll_task_reject");
                      }
                  });
          //设置为true,corePoolSize_alivetime后自动销毁
          allowCoreThreadTimeOut(true);
      }
    • init-基本监控定时获取

      @PostConstruct
      private void init() {
      //添加常用监控
      final ScheduledExecutorService coreMonitorService = Executors.newScheduledThreadPool(1);
      coreMonitorService.scheduleAtFixedRate(new Runnable() {
          @Override
          public void run() {
              Monitor.recordSize(THREAD_FACTORY_NAME + "_active_thread_count", getActiveCount());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_pool_size", getPoolSize());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_queue_size", getQueue().size());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_largest_pool_size", getLargestPoolSize());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_task_count", getTaskCount());
              Monitor.recordSize(THREAD_FACTORY_NAME + "_completed_task_count", getCompletedTaskCount());
          }
      }, 1L, 2L, TimeUnit.SECONDS);
      
      Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
          @Override
          public void run() {
              shutdown();
              coreMonitorService.shutdown();
          }
      }));
      }
    • 重写submit

      @Override
      public MonitoringFutureTask<?> submit(Runnable task){
      if (task == null) {
          throw new NullPointerException();
      }
      if (task instanceof NamedRunnable) {
          MonitoringFutureTask<?> monitoringFutureTask = new MonitoringFutureTask<>(task, null);
          execute(monitoringFutureTask);
          return monitoringFutureTask;
      }else {
          throw new ForbiddenException("请使用NamedRunnable!");
      }
      }
    • 动态修改线程池核心配置

      @Config("can_monitor_thread_pool_executor.properties")
      private void changeProperties(Map<String, String> config) {
      logger.info("can_monitor_thread_pool_executor:{}", config);
      if (config != null) {
          int coreSize = IntegerUtil.parseStrToInt(config.get("coreSize"));
          if (coreSize > 0) {
              setCorePoolSize(coreSize);
          }
          int maxSize = IntegerUtil.parseStrToInt(config.get("maxSize"));
          if (maxSize > 0) {
              setMaximumPoolSize(maxSize);
          }
          int queueSize = IntegerUtil.parseStrToInt(config.get("queueSize"));
          if (queueSize > 0) {
              monitoringQueue.setMaxQueueSize(queueSize);
          }
          int keepAliveTime = IntegerUtil.parseStrToInt(config.get("keepAliveTime"));
          if (keepAliveTime > 0) {
              String timeUnitStr = config.get("timeUnit");
              if (timeUnitStr != null) {
                  TimeUnit timeUnit;
                  try {
                      timeUnit = TimeUnit.valueOf(timeUnitStr);
                      setKeepAliveTime(keepAliveTime, timeUnit);
                  } catch (IllegalArgumentException e) {
                      Monitor.recordOne("timeUnit_config_error");
                      setKeepAliveTime(keepAliveTime, TimeUnit.SECONDS);
                  }
              } else {
                  setKeepAliveTime(keepAliveTime, TimeUnit.SECONDS);
              }
          }
      }
      }
    • -
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值