首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

quartz定时任务不执行的有关问题

2013-10-31 
quartz定时任务不执行的问题我的是一个用quartz做的定时任务动态管理的项目现在遇到一个问题是多个定时任

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

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分钟,保证任务不会因为超时不启动;不起作用  

找了两天了 实在不知道他为什么会不执行,哪位高人又遇到这种情况?指点指点,感激不尽!
没分了全给了 quartz spring
[解决办法]
我这边的版本:MethodInvokingJobDetailFactoryBean 的concurrent 字段实现是否并发执行。
实现如下:
Class jobClass = (this.concurrent ? (Class) MethodInvokingJob.class : StatefulMethodInvokingJob.class);

热点排行