石英调度器:触发器执行时间不一致

3
我有几个使用Quartz 1.6.6的Java应用程序,运行在Weblogic和Spring上(一个使用Spring v.2.5.4;另一个使用Spring v.3.1.1)。我的架构中有两台应用服务器在Weblogic集群中。
这些应用程序都设置了简单的触发器(使用org.springframework.scheduling.quartz.SchedulerFactoryBean、org.springframework.scheduling.quartz.SimpleTriggerBean和org.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

第二个应用程序有两个触发进程,分别在以下时间执行:

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>

有什么想法为什么会这样吗?提前感谢。

你能否检查在运行这两组调度程序时,数据库中是否存在未释放的锁定? - ali haider
感谢您的想法。
  1. 我不确定我应该检查数据库的什么;但我可以确认 QRTZ_TRIGGERS.TRIGGER_STATE 主要是处于等待状态,每分钟有几秒钟是已获取。
  2. 是的,这些作业在60秒时间段内完成得非常好。
  3. 将增加线程计数并报告结果。
- GarlicBread
1
你可以尝试将isclustered值设置为false后再试一下。我猜将其指定为集群会使quartz作业共享运行时间/负载。 - Sudhakar
是的,这就是我想做的。我尝试使用聚类,因为我发现在我们拥有的Weblogic架构中,触发器会被触发两次,每个应用服务器都会触发一次。我希望实现聚类,以便两个应用服务器可以同步,并且每个触发器只会被触发一次。 - GarlicBread
我已经升级到Quartz版本1.8.6(显然,任何超过2.0版本的Quartz都无法与Spring一起使用),但仍然遇到同样的问题。 - GarlicBread
显示剩余3条评论
1个回答

0
看起来问题已经解决了:这个问题更多地与依赖于不一致的日志消息来暗示不一致的触发时间有关,而与Quartz无关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接