springframework.scheduling.quartz工作调度器使用(二)-自定义多线程池任务

实现场景一:频率H1(5分钟)任务定时执行,但频率内任务执行所需时间超过频率时间段,出现频率内任务未执行完成,被下一次执行的任务中途中断的情况;

公司平台系统场景:定时任务 每5分钟可查询平台日志数据表记录大约为100万行,每1万行写入一个文件,即5分钟内需要生成100个文件,并存储到磁盘,但操作系统实际IO读写最高效率(假设)为  10个/1分钟,在当前任务在生成第50个文件时,下一间隔任务开始执行,并中断前一任务,导致未生成的50个文件数据丢失。

目        的:为解决  实现场景一【公司平台系统场景】 出现的任务在执行过程中被中断,出现数据丢失的问题和情况,采用quartz工作调度器进行任务调度,自定义多线程池去处理任务所需要做的工作。

方  案  一:springframework.scheduling.quartz工作调度器配置任务调度和自定义多线程池

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
       "
	default-lazy-init="false">
	<bean id="configholder"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	</bean>
	<context:annotation-config />
	<tx:annotation-driven proxy-target-class="true" />
	
    <bean id="ruleService" class="com.hp.bon.omc.nms.core.threadPool.RuleService2"></bean>
    <!-- 定时 -->
    <bean id="ruleBean"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="ruleService" />
        <property name="targetMethod" value="updateRule" />
        <property name="concurrent" value="false" />
     </bean> 

    <bean id="rule" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="ruleBean" />
        <!-- 每30秒 执行 -->
        <property name="cronExpression" value="0/30 * * * * ?"/>
    </bean>
    
    <!-- 定时 end -->
    <bean id="startQuertz" lazy-init="false" autowire="no"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
         <property name="jobDetails">
          <list>
            <ref bean="ruleBean" />
          </list>
        </property>

        <property name="triggers">
          <list>
             <ref bean="rule" />
          </list>
        </property>
        <!-- 启动时延期10秒开始任务 -->
        <property name="startupDelay" value="10" />
    </bean>
    
    <!--  job end-->
    
    <bean id="threadPoolTaskExecutor"
      class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
      <!-- 核心线程数,默认为5 -->
      <property name="corePoolSize" value="5" />

      <!-- 最大线程数,默认为Integer.MAX_VALUE -->
      <property name="maxPoolSize" value="10" />

      <!-- 队列最大长度,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE -->
     <property name="queueCapacity" value="300" /> 

      <!-- 线程池维护线程所允许的空闲时间,默认为60s -->
      <property name="keepAliveSeconds" value="360" />

      <!-- 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者 -->
      <property name="rejectedExecutionHandler">
          <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
      </property>
    </bean>
   
    <bean id="contextUtil" class="com.hp.bon.omc.nms.core.threadPool.ContextUtil"></bean>
</beans>

自定义com.hp.bon.omc.nms.core.threadPool.RuleService2任务类:

package com.hp.bon.omc.nms.core.threadPool;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;

@Service
public class RuleService2 {
	private static final Logger LOG = LoggerFactory.getLogger(RuleService2.class);
	public void updateRule() {
		updateRuleThreadPoolTaskExecutor();
	}

	public void updateRuleThreadPoolTaskExecutor() {
		LOG.info("任务已经调度,服务RuleService2已开始执行........");
                ThreadPoolTaskExecutor threadPoolTaskExecutor = (ThreadPoolTaskExecutor) ContextUtil
                .getBean("threadPoolTaskExecutor");
                ThreadPoolExecutor executor = threadPoolTaskExecutor.getThreadPoolExecutor();
                LOG.info("任务队列BlockingQueue存放任务大小="+executor.getQueue().size());
		List<String> strList = new ArrayList<String>();
		for (int i = 0; i < 30; i++) {
			strList.add("test" + i);
		}
		for (int i = 0; i < strList.size(); i++) {
			threadPoolTaskExecutor.execute(new Thread(new StartTaskThread2(strList.get(i))));
		}
	}
} 
    底层任务队列为BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(300),
多线程池任务执行器ThreadPoolTaskExecutor在protected ExecutorService initializeExecutor初始化时,
定义了java.util.concurrent.ThreadPoolExecutor多线程池ThreadPoolExecutor
见 org.springframework.context-3.1.2.RELEASE.jar包org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
类文件,包源代码为:package org.springframework.scheduling.concurrent;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.springframework.core.task.TaskRejectedException;
import org.springframework.scheduling.SchedulingTaskExecutor;
import org.springframework.util.Assert;

public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport
  implements SchedulingTaskExecutor
{
  private final Object poolSizeMonitor = new Object();
  private int corePoolSize = 1;
  private int maxPoolSize = 2147483647;
  private int keepAliveSeconds = 60;
  private boolean allowCoreThreadTimeOut = false;
  private int queueCapacity = 2147483647;
  private ThreadPoolExecutor threadPoolExecutor;
    .....

 protected ExecutorService initializeExecutor(ThreadFactory threadFactory, 
RejectedExecutionHandler rejectedExecutionHandler)
  {
    BlockingQueue queue = createQueue(this.queueCapacity);
    ThreadPoolExecutor executor = new ThreadPoolExecutor(
      this.corePoolSize, this.maxPoolSize, this.keepAliveSeconds, TimeUnit.SECONDS, 
      queue, threadFactory, rejectedExecutionHandler);
    if (this.allowCoreThreadTimeOut) {
      executor.allowCoreThreadTimeOut(true);
    }
    this.threadPoolExecutor = executor;
    return executor;
  }

  protected BlockingQueue<Runnable> createQueue(int queueCapacity)
  {
    if (queueCapacity > 0) {
      return new LinkedBlockingQueue(queueCapacity);
    }
    return new SynchronousQueue();
  }

  public ThreadPoolExecutor getThreadPoolExecutor()
    throws IllegalStateException
  {
    Assert.state(this.threadPoolExecutor != null, "ThreadPoolTaskExecutor not initialized");
    return this.threadPoolExecutor;
  }
.....
}

自定义线程处理类StartTaskThread2类:

package com.hp.bon.omc.nms.core.threadPool;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StartTaskThread2 implements Runnable {
	private static final Logger LOG = LoggerFactory.getLogger(StartTaskThread2.class);
	private String st;
	public StartTaskThread2(String st) {
		this.st = st;
	}
	@Override
	public void run() {
	    synchronized (this) {
		try {
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		    LOG.info("Time:" + df.format(new Date()) + ",Thread Name:" + Thread.currentThread().getName()+ ",st="+st);
		    Thread.sleep(8*1000);
		} catch (InterruptedException e) {e.printStackTrace();}
	    }
	}
}

任务执行的线程每次Sleep 8秒。

工具类ContextUtil:

package com.hp.bon.omc.nms.core.threadPool;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

/**
 * 取线程配置工具类,主动获取spring注入的DAO类的Bean
 */
public class ContextUtil implements ApplicationContextAware {
	private static ApplicationContext context;
	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		context = applicationContext;
	}
	public static ApplicationContext getContext() {
		return context;
	}
	public static Object getBean(String beanName) {
		return context.getBean(beanName);
	}

}

运行结果:

<!-- 间隔30秒调度任务,5个线程每隔8秒从队列中并行取出5个任务,4个8秒一共完成20个  -->
2018-04-13 17:03:00.043 INFO  [startQuertz_Worker-1] - 任务已经调度,服务RuleService2已开始执行........
2018-04-13 17:03:00.044 INFO  [startQuertz_Worker-1] - 任务队列BlockingQueue存放任务大小=0
2018-04-13 17:03:00.049 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:03:00...st=test0
2018-04-13 17:03:00.051 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:03:00...st=test1
2018-04-13 17:03:00.053 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:03:00...st=test3
2018-04-13 17:03:00.054 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:03:00...st=test4
2018-04-13 17:03:00.051 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:03:00...st=test2

2018-04-13 17:03:08.050 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:03:08...st=test5
2018-04-13 17:03:08.055 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:03:08...st=test6
2018-04-13 17:03:08.056 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:03:08...st=test7
2018-04-13 17:03:08.061 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:03:08...st=test8
2018-04-13 17:03:08.076 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:03:08...st=test9

2018-04-13 17:03:16.177 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:03:16...st=test10
2018-04-13 17:03:16.179 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:03:16...st=test11
2018-04-13 17:03:16.180 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:03:16...st=test12
2018-04-13 17:03:16.180 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:03:16...st=test13
2018-04-13 17:03:16.181 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:03:16...st=test14

2018-04-13 17:03:24.187 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:03:24...st=test15
2018-04-13 17:03:24.187 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:03:24...st=test16
2018-04-13 17:03:24.192 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:03:24...st=test18
2018-04-13 17:03:24.193 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:03:24...st=test17
2018-04-13 17:03:24.204 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:03:24...st=test19

....
<!-- 间隔30秒调度任务,
首先:由于上一频率任务队列中余下10个任务未执行完成,且无空闲、多余线程,任务在已经调度情况下处于等待.....
    等待下个8秒线程释放(5个),释放的线程优先执行上一频率任务队列中余下10个任务中的5个;
    再次等待下个8秒线程释放(5个),释放的线程执行上一频率任务队列中余下5个任务,
    最终完成上一频率任务队列中所有的任务即30个;
其次:等待下个8秒线程释放5个线程,开始执行当前频率任务队列中30个任务中的10个  -->

2018-04-13 17:03:30.003 INFO  [startQuertz_Worker-2] - 任务已经调度,服务RuleService2已开始执行........
2018-04-13 17:03:30.003 INFO  [startQuertz_Worker-2] - 任务队列BlockingQueue存放任务大小=10
2018-04-13 17:03:32.189 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:03:32...st=test20
2018-04-13 17:03:32.191 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:03:32...st=test21
2018-04-13 17:03:32.193 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:03:32...st=test22
2018-04-13 17:03:32.194 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:03:32...st=test23
2018-04-13 17:03:32.206 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:03:32...st=test24
2018-04-13 17:03:40.189 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:03:40...st=test25
2018-04-13 17:03:40.191 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:03:40...st=test26
2018-04-13 17:03:40.193 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:03:40...st=test27
2018-04-13 17:03:40.194 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:03:40...st=test28
2018-04-13 17:03:40.206 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:03:40...st=test29

2018-04-13 17:03:48.189 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:03:48...st=test0
2018-04-13 17:03:48.191 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:03:48...st=test1
2018-04-13 17:03:48.193 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:03:48...st=test2
2018-04-13 17:03:48.194 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:03:48...st=test3
2018-04-13 17:03:48.207 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:03:48...st=test4
2018-04-13 17:03:56.190 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:03:56...st=test5
2018-04-13 17:03:56.192 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:03:56...st=test6
2018-04-13 17:03:56.194 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:03:56...st=test7
2018-04-13 17:03:56.196 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:03:56...st=test8
2018-04-13 17:03:56.208 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:03:56...st=test9

...中间系列间隔30秒调度任务即 startQuertz_Worker-3 至  startQuertz_Worker-9 工作调度线程产生的日志省去...

<!-- 间隔30秒调度任务,Quertz工作调度线程达到最大数Worker-10,执行逻辑同上一致
首先:等待线程释放,释放的线程执行上一频率任务队列中余下任务,最终完成上一频率任务队列中所有的任务;
其次:等待线程释放,释放的线程执行当前频率任务队列中任务10个;  -->
2018-04-13 17:07:30.003 INFO  [startQuertz_Worker-10] - 任务已经调度,服务RuleService2已开始执行........
2018-04-13 17:07:30.003 INFO  [startQuertz_Worker-10] - 任务队列BlockingQueue存放任务大小=100
2018-04-13 17:07:32.264 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:07:32...st=test20
2018-04-13 17:07:32.269 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:07:32...st=test21
2018-04-13 17:07:32.305 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:07:32...st=test22
2018-04-13 17:07:32.306 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:07:32...st=test23
2018-04-13 17:07:32.308 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:07:32...st=test24
2018-04-13 17:07:40.266 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:07:40...st=test25
2018-04-13 17:07:40.270 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:07:40...st=test26
2018-04-13 17:07:40.306 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:07:40...st=test27
2018-04-13 17:07:40.307 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:07:40...st=test28
2018-04-13 17:07:40.309 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:07:40...st=test29

2018-04-13 17:07:48.278 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:07:48...st=test0
2018-04-13 17:07:48.281 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:07:48...st=test1
2018-04-13 17:07:48.310 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:07:48...st=test2
2018-04-13 17:07:48.315 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:07:48...st=test3
2018-04-13 17:07:48.316 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:07:48...st=test4
2018-04-13 17:07:56.281 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:07:56...st=test5
2018-04-13 17:07:56.282 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:07:56...st=test6
2018-04-13 17:07:56.316 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:07:56...st=test7
2018-04-13 17:07:56.317 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:07:56...st=test8
2018-04-13 17:07:56.318 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:07:56...st=test9
....

<!-- 间隔30秒调度任务,当任务队列BlockingQueue存放任务达到280时,线程池开始从maxPoolSize中再创建5个新线程处理任务。
首先:等待线程释放(10个),释放的线程执行上一频率任务队列中余下任务,最终完成上一频率任务队列中所有的任务;
其次:等待线程释放(10个),释放的线程执行当前频率任务队列中任务10个;  -->

2018-04-13 17:15:30.002 INFO  [startQuertz_Worker-6] - 任务已经调度,服务RuleService2已开始执行........
2018-04-13 17:15:30.002 INFO  [startQuertz_Worker-6] - 任务队列BlockingQueue存放任务大小=280
2018-04-13 17:15:30.004 INFO  [threadPoolTaskExecutor-6] - Time:2018-04-13 17:15:30...st=test20
2018-04-13 17:15:30.005 INFO  [startQuertz_Worker-6] - Time:2018-04-13 17:15:30...st=test25
2018-04-13 17:15:30.005 INFO  [threadPoolTaskExecutor-9] - Time:2018-04-13 17:15:30...st=test23
2018-04-13 17:15:30.006 INFO  [threadPoolTaskExecutor-10] - Time:2018-04-13 17:15:30...st=test24
2018-04-13 17:15:30.006 INFO  [threadPoolTaskExecutor-7] - Time:2018-04-13 17:15:30...st=test21
2018-04-13 17:15:30.006 INFO  [threadPoolTaskExecutor-8] - Time:2018-04-13 17:15:30...st=test22
2018-04-13 17:15:33.829 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:15:33...st=test20
2018-04-13 17:15:33.837 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:15:33...st=test21
2018-04-13 17:15:33.845 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:15:33...st=test22
2018-04-13 17:15:33.846 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:15:33...st=test23
2018-04-13 17:15:33.853 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:15:33...st=test24
2018-04-13 17:15:38.005 INFO  [threadPoolTaskExecutor-6] - Time:2018-04-13 17:15:38...st=test25
2018-04-13 17:15:38.006 INFO  [threadPoolTaskExecutor-9] - Time:2018-04-13 17:15:38...st=test26
2018-04-13 17:15:38.006 INFO  [threadPoolTaskExecutor-7] - Time:2018-04-13 17:15:38...st=test27
2018-04-13 17:15:38.006 INFO  [threadPoolTaskExecutor-10] - Time:2018-04-13 17:15:38...st=test28
2018-04-13 17:15:38.007 INFO  [threadPoolTaskExecutor-8] - Time:2018-04-13 17:15:38...st=test29
2018-04-13 17:15:41.829 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:15:41...st=test0
2018-04-13 17:15:41.837 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:15:41...st=test1
2018-04-13 17:15:41.845 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:15:41...st=test2
2018-04-13 17:15:41.847 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:15:41...st=test3
2018-04-13 17:15:41.853 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:15:41...st=test4
2018-04-13 17:15:46.009 INFO  [threadPoolTaskExecutor-7] - Time:2018-04-13 17:15:46...st=test5
2018-04-13 17:15:46.010 INFO  [threadPoolTaskExecutor-8] - Time:2018-04-13 17:15:46...st=test6
2018-04-13 17:15:46.013 INFO  [threadPoolTaskExecutor-6] - Time:2018-04-13 17:15:46...st=test7
2018-04-13 17:15:46.025 INFO  [threadPoolTaskExecutor-9] - Time:2018-04-13 17:15:46...st=test8
2018-04-13 17:15:46.026 INFO  [threadPoolTaskExecutor-10] -Time:2018-04-13 17:15:46...st=test9
2018-04-13 17:15:49.831 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:15:49...st=test10
2018-04-13 17:15:49.838 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:15:49...st=test11
2018-04-13 17:15:49.847 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:15:49...st=test12
2018-04-13 17:15:49.850 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:15:49...st=test13
2018-04-13 17:15:49.854 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:15:49...st=test14
2018-04-13 17:15:54.010 INFO  [threadPoolTaskExecutor-7] - Time:2018-04-13 17:15:54...st=test15
2018-04-13 17:15:54.011 INFO  [threadPoolTaskExecutor-8] - Time:2018-04-13 17:15:54...st=test16
2018-04-13 17:15:54.025 INFO  [threadPoolTaskExecutor-6] - Time:2018-04-13 17:15:54...st=test17
2018-04-13 17:15:54.026 INFO  [threadPoolTaskExecutor-10] - Time:2018-04-13 17:15:54...st=test18
2018-04-13 17:15:54.026 INFO  [threadPoolTaskExecutor-9] - Time:2018-04-13 17:15:54...st=test19
2018-04-13 17:15:57.831 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:15:57...st=test20
2018-04-13 17:15:57.838 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:15:57...st=test21
2018-04-13 17:15:57.848 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:15:57...st=test22
2018-04-13 17:15:57.850 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:15:57...st=test23
2018-04-13 17:15:57.854 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:15:57...st=test24

<!-- 间隔30秒调度任务,由于线程池由5个变成10个线程,加强任务处理能力,务队列BlockingQueue存放任务由280又逐渐减少至69-->
2018-04-13 17:29:30.002 INFO  [startQuertz_Worker-4] - 任务已经调度,服务RuleService2已开始执行........
2018-04-13 17:29:30.002 INFO  [startQuertz_Worker-4] - 任务队列BlockingQueue存放任务大小=69
2018-04-13 17:29:30.219 INFO  [threadPoolTaskExecutor-7] - Time:2018-04-13 17:29:30...st=test21
2018-04-13 17:29:30.220 INFO  [threadPoolTaskExecutor-8] - Time:2018-04-13 17:29:30...st=test22
2018-04-13 17:29:30.225 INFO  [threadPoolTaskExecutor-6] - Time:2018-04-13 17:29:30...st=test23
2018-04-13 17:29:30.228 INFO  [threadPoolTaskExecutor-10] - Time:2018-04-13 17:29:30...st=test24
2018-04-13 17:29:30.237 INFO  [threadPoolTaskExecutor-9] - Time:2018-04-13 17:29:30...st=test25
2018-04-13 17:29:33.997 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:29:33...st=test26
2018-04-13 17:29:34.008 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:29:34...st=test27
2018-04-13 17:29:34.078 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:29:34...st=test28
2018-04-13 17:29:34.140 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:29:34...st=test29
2018-04-13 17:29:34.145 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:29:34...st=test0
2018-04-13 17:29:38.220 INFO  [threadPoolTaskExecutor-7] - Time:2018-04-13 17:29:38...st=test2
2018-04-13 17:29:38.220 INFO  [threadPoolTaskExecutor-8] - Time:2018-04-13 17:29:38...st=test1
2018-04-13 17:29:38.225 INFO  [threadPoolTaskExecutor-6] - Time:2018-04-13 17:29:38...st=test3
2018-04-13 17:29:38.228 INFO  [threadPoolTaskExecutor-10] - Time:2018-04-13 17:29:38...st=test4
2018-04-13 17:29:38.237 INFO  [threadPoolTaskExecutor-9] - Time:2018-04-13 17:29:38...st=test5
2018-04-13 17:29:41.998 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:29:41...st=test6
2018-04-13 17:29:42.008 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:29:42...st=test7
2018-04-13 17:29:42.091 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:29:42...st=test8
2018-04-13 17:29:42.140 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:29:42...st=test9
2018-04-13 17:29:42.150 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:29:42...st=test10
2018-04-13 17:29:46.221 INFO  [threadPoolTaskExecutor-8] - Time:2018-04-13 17:29:46...st=test11
2018-04-13 17:29:46.223 INFO  [threadPoolTaskExecutor-7] - Time:2018-04-13 17:29:46...st=test12
2018-04-13 17:29:46.226 INFO  [threadPoolTaskExecutor-6] - Time:2018-04-13 17:29:46...st=test13
2018-04-13 17:29:46.230 INFO  [threadPoolTaskExecutor-10] - Time:2018-04-13 17:29:46...st=test14
2018-04-13 17:29:46.238 INFO  [threadPoolTaskExecutor-9] - Time:2018-04-13 17:29:46...st=test15
2018-04-13 17:29:50.000 INFO  [threadPoolTaskExecutor-3] - Time:2018-04-13 17:29:50...st=test16
2018-04-13 17:29:50.013 INFO  [threadPoolTaskExecutor-1] - Time:2018-04-13 17:29:50...st=test17
2018-04-13 17:29:50.104 INFO  [threadPoolTaskExecutor-2] - Time:2018-04-13 17:29:50...st=test18
2018-04-13 17:29:50.143 INFO  [threadPoolTaskExecutor-4] - Time:2018-04-13 17:29:50...st=test19
2018-04-13 17:29:50.155 INFO  [threadPoolTaskExecutor-5] - Time:2018-04-13 17:29:50...st=test20
2018-04-13 17:29:54.223 INFO  [threadPoolTaskExecutor-8] - Time:2018-04-13 17:29:54...st=test21
2018-04-13 17:29:54.224 INFO  [threadPoolTaskExecutor-7] - Time:2018-04-13 17:29:54...st=test22
2018-04-13 17:29:54.227 INFO  [threadPoolTaskExecutor-6] - Time:2018-04-13 17:29:54...st=test23
2018-04-13 17:29:54.231 INFO  [threadPoolTaskExecutor-10] - Time:2018-04-13 17:29:54...st=test24
2018-04-13 17:29:54.239 INFO  [threadPoolTaskExecutor-9] - Time:2018-04-13 17:29:54...st=test25


结 论:频率内任务执行所需时间超过频率时间段,任务不会被下一次执行的任务中途中断,能正常完成所有的任务;但第二个30秒时间节点(即下一频率)调度任务时,由于无空闲线程,出现调度任务内的线程大量等待,直至有线程释放时才开始处理队列内的任务,导致调度任务执行的工作廷迟。


猜你喜欢

转载自blog.csdn.net/jun55xiu/article/details/79917656