quartz定时任务不执行的问题

海若 2013-10-24 01:53:21
我的是一个用quartz做的定时任务动态管理的项目
现在遇到一个问题是多个定时任务同时进行的时候,某些任务会在某次执行的时间点漏掉(查看日志没有任何报错信息,但是该次任务没有执行)



如上图:第一个任务为每15分钟执行一次,执行时间点为每小时的[0,15,30,45];第二个为每是10分钟一次,时间点为[0,10,20,30,40,50];每个任务又是开启多线程来执行;
每个任务执行一次所用时间大概为2分钟,查看结果发现有漏掉的情况:譬如15分钟的任务某一小时内只在[0,30,45]刻钟执行了,漏掉了第15分钟
以下是关于quartz的配置情况
1.quartz.properties
#============================================================================
# Configure Main Scheduler Properties
#============================================================================

org.quartz.scheduler.instanceName = atpScheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool
#============================================================================

orgorg.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 50
org.quartz.threadPool.threadPriority = 9
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = false
#============================================================================
# Configure JobStore
#============================================================================
#set misfire time to 3 mine
org.quartz.jobStore.misfireThreshold = 180000

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.tablePrefix = qrtz_
org.quartz.jobStore.isClustered = false

#============================================================================
# Configure Plugins
#============================================================================
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin

org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true


2.spring的applicationContext.xml:
<!--初始化SchedulerFactoryBean -->
<bean name="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean" destroy-method="destroy" lazy-init="false">
<property name="dataSource" ref="dataSource"/>
<!--延迟5秒启动 -->
<property name="startupDelay" value="5" />
<property name="applicationContextSchedulerContextKey" value="atp-Scheduler" />
<property name="configLocation" value="classpath:quartz.properties" />
<property name="schedulerContextAsMap">
<map>
<description>schedulerContextAsMap</description>
<entry key="runTaskService" value-ref="runTaskService"/>
</map>
</property>
</bean>

3.每次任务执行时就新创建一个线程池运行该任务下的用例,执行完就关闭线程池,JAVA代码如下:
/**
* 处理数据
*/
@Override
public void disposeData(List<TestCaseResult> listTcr, String uuid) {

ExecutorService servicePoolThread = Executors.newFixedThreadPool(task.getThread_num());// 创建线程池
try {
for (Thread t : publicThread) {
servicePoolThread.submit(t);
}
servicePoolThread.shutdown();
boolean loop = true;
do { // 等待所有线程结束
loop = !servicePoolThread.awaitTermination(5, TimeUnit.SECONDS);
logger.info(uuid+ "`====== waiting for the end of All threads ======");
} while (loop);
logger.info(uuid+ "`====== shutdown the thread pool,main end ======");
} catch (InterruptedException e) {
servicePoolThread.shutdownNow();
Thread.currentThread().interrupt();
logger.error(uuid+ "`==== error in run periodJob(disposeData) --->"+ e.getMessage());
e.printStackTrace();
}
}


============================================================================================
以上程序有关线程调用的大体情况,在网上查了一些解决方法
(1).有可能web关闭过程中没有正常关闭quartz,导致下次重启后quartz执行有问题
在监听器中添加了quartz的shutdown方法,
web.xml增加了内存清理监控org.springframework.web.util.IntrospectorCleanupListener
quartz开启关闭都没问题了,但是任务执行次数还是会漏掉
(2).怀疑同一时间并发量大,任务没有被分配执行,
就把每个任务的cron表达式改成分散开启动:譬如 0 0/15 * * * ? 0 6/10 * * * ?
还是没用
找了一个实时监控电脑线程数的工具,发现执行时候线程总量没有明显增加,一直在(820-850)之间
(3).
每个任务执行完成顶多不会超过3分钟、我把任务超时时间(misfireThreshold )设置成5分钟,保证任务不会因为超时不启动;不起作用

找了两天了 实在不知道他为什么会不执行,哪位高人又遇到这种情况?指点指点,感激不尽!
没分了全给了
...全文
32349 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
海若 2013-10-29
  • 打赏
  • 举报
回复
引用 4 楼 zhuweisyyc 的回复:
上面的两个实现都是继承org.quartz.Job。
是我的数据库连接池的问题,任务执行时没有拿到连接,是输出了错误日志的 马虎了没看到。。。。 还是感谢您的回答
zhuweisyyc 2013-10-24
  • 打赏
  • 举报
回复
上面的两个实现都是继承org.quartz.Job。
zhuweisyyc 2013-10-24
  • 打赏
  • 举报
回复
我这边的版本:MethodInvokingJobDetailFactoryBean 的concurrent 字段实现是否并发执行。 实现如下: Class jobClass = (this.concurrent ? (Class) MethodInvokingJob.class : StatefulMethodInvokingJob.class);
海若 2013-10-24
  • 打赏
  • 举报
回复
引用 1 楼 zhuweisyyc 的回复:
是不是单个任务配置了串行执行,在触发点上第一次没有执行完,就不会再触发,而是继续执行没有完成的任务,直到下一个触发点。
我的Job是继承的org.quartz.Job (无状态),这样是不是就保证了同一任务可并发?
zhuweisyyc 2013-10-24
  • 打赏
  • 举报
回复
是不是单个任务配置了串行执行,在触发点上第一次没有执行完,就不会再触发,而是继续执行没有完成的任务,直到下一个触发点。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧