2012-07-25 484 views
3

我有几个Java应用程序在Weblogic上使用Quartz 1.6.6(一个使用Spring v.2.5.4;另一个使用Spring v.3.1.1)。我的架构在Weblogic群集中有两个应用程序服务器。Quartz Scheduler:触发器执行的时间不一致

这两个应用程序都有简单的触发器设置(使用org.springframework.scheduling.quartz.SchedulerFactoryBean,org.springframework.scheduling.quartz.SimpleTriggerBeanorg.springframework.scheduling.quartz.JobDetailBean)。他们都设置为每60秒运行一次。

我已将日志记录添加到关联的org.springframework.scheduling.quartz.QuartzJobBean(在executeInternal()方法的开始处),该日志写入执行进程的时间。

我发现的是,时间不一致 - 有时一个给定的分钟执行不会发生。实例:

应用1具有将其在以下时间执行的一个触发过程:

14:26:26,098 
14:28:26,089 
14:31:26,096 
14:33:26,093 
14:35:26,095 
14:36:26,098 
14:38:26,103 

应用2具有分别在以下时间执行的两个触发器的过程:

14:40:05,951 (trigger 1) 
14:41:05,951 (trigger 2) 
14:42:05,943 (trigger 1) 
14:43:05,954 (trigger 2) 
14:44:05,937 (trigger 1) 
14:45:05,956 (trigger 2) 
14:46:05,953 (trigger 2) 
14:47:05,937 (trigger 1) 
14:48:05,941 (trigger 1) 
14:49:05,939 (trigger 1) 
14:50:05,951 (trigger 2) 

如果我将一个Weblogic应用程序服务器关闭,然后这两个应用程序都非常高兴地每分钟都运行所有的作业。

我检查了所有作业的数据库表,QRTZ_SIMPLE_TRIGGERS.REPEAT_INTERVAL正确(60,000毫秒)。 QRTZ_TRIGGERS.PREV_FIRE_TIMEQRTZ_TRIGGERS.NEXT_FIRE_TIME之间的差异也是60,000。

在应用程序上下文文件我quartzProperties定义有如下条目:

<property name="quartzProperties"> 
    <props> 
     <prop key="org.quartz.scheduler.instanceName">MyClusteredScheduler</prop> 
     <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
     <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> 
     <prop key="org.quartz.threadPool.threadCount">5</prop> 
     <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop> 
     <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop> 
     <prop key="org.quartz.jobStore.isClustered">true</prop> 
     <prop key="org.quartz.jobStore.clusterCheckinInterval">5000</prop> 
     <prop key="org.quartz.jobStore.dataSource">myDS</prop> 
     <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop> 
     <prop key="org.quartz.dataSource.myDS.driver">oracle.jdbc.driver.OracleDriver</prop> 
     <prop key="org.quartz.dataSource.myDS.URL">{db connection string}</prop> 
     <prop key="org.quartz.dataSource.myDS.user">{username}</prop> 
     <prop key="org.quartz.dataSource.myDS.password">{password}</prop> 
     <prop key="org.quartz.dataSource.myDS.maxConnections">5</prop> 
     <prop key="org.quartz.dataSource.myDS.validationQuery">select 0 from dual</prop> 
    </props> 
</property> 

时为什么这应该是有什么想法?提前致谢。

+0

当您运行两组调度程序时,您是否可以检查数据库上是否存在未释放的锁? – 2012-07-25 03:25:14

+0

1分钟内完成工作吗?因为石英工作是有状态的,因此不会有两个平行的工作实例。另外,考虑增加线程数量。 – 2012-07-25 03:28:51

+0

感谢您的想法。 1)不知道我会检查数据库;我可以确认QRTZ_TRIGGERS.TRIGGER_STATE主要是等待每分钟ACQUIRED几秒钟。 2)是的,这些工作在60秒的时间内完成。 3)会增加线程数并回报。 – GarlicBread 2012-07-25 03:34:05

回答

0

看似固定:这个问题更多的是依赖不一致的日志消息来建议不一致的触发时间,而不是Quartz的任何事情。