实现场景一:频率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秒时间节点(即下一频率)调度任务时,由于无空闲线程,出现调度任务内的线程大量等待,直至有线程释放时才开始处理队列内的任务,导致调度任务执行的工作廷迟。