我有几个 Java 应用程序在带有 Spring 的 Weblogic 上使用 Quartz 1.6.6(一个使用 Spring v. 2.5.4;另一个使用 Spring v. 3.1.1)。我的架构在 Weblogic 集群中有两个应用服务器。
两个应用程序都设置了简单的触发器(使用和org.springframework.scheduling.quartz.SchedulerFactoryBean
)。它们都设置为每 60 秒运行一次。org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.JobDetailBean
我已将日志记录添加到关联的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_TIME
和之间的差值QRTZ_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>
关于为什么会这样的任何想法?提前致谢。