根据组条件从db筛选中加载Quartz加载作业

时间:2019-03-20 11:51:55

标签: java spring quartz-scheduler restore quartz

在我的spring boot应用程序中,使用了quartz启动器。产生的所有作业都在运行时添加到DB中。数据库使用了不同的服务,但是只能使用填充了作业的服务来处理作业。

启动任何服务时,我需要保证仅将由该服务产生的作业添加到石英作业上下文中。我们可以按指定的组检测这些作业。

问题是:

1

如何用最少的更改来管理作业加载程序(使用开箱即用的解决方案)仅按指定的组过滤作业(在此作业上下文中不应处理不同的组)?

2

如何仅在石英调度程序中注册对当前服务有效的JobClass? (例如,示例服务可能仅支持googleRetry作业,但数据库包含fbRetry和linkedInRetry。该实例应仅加载googleRetry作业。)我希望它可以从另一侧管理作业加载。

3

我在石英DriverDelegate中检测到了下一种方法

/**
 * <p>
 * Get the names of all of the triggers in the given group and state that
 * have misfired - according to the given timestamp.
 * </p>
 * 
 * @param conn
 *          the DB Connection
 * @return an array of <code>{@link
 * org.quartz.utils.Key}</code> objects
 */
List<TriggerKey> selectMisfiredTriggersInGroupInState(Connection conn,
    String groupName, String state, long ts) throws SQLException;

但没有使用。我希望它应在特殊的恢复模式下使用(例如,按组恢复过滤),但没有用处。我试图通过自己需要的功能来管理CustomDelegate升级selectTriggersForRecoveringJobs,但在这种情况下却获得了CURSOR issue

是否可以使用selectMisfiredTriggersInGroupInState配置石英恢复模式?

1 个答案:

答案 0 :(得分:1)

似乎注意力集中在不同的事物上。 Quartz Scheduler绝对应该知道自己的工作。另外的想法是为不同的服务(例如,不同的服务)管理石英调度程序(仅对于同一集群类似)。解决方案是指定调度程序名称:

spring:
  quartz:
    job-store-type: jdbc
    properties:
      org:
        quartz:
          thread-pool:
            thread-count: 5
          scheduler:
            instanceName: mailCluster

计划程序实例名称在SCHED_NAME列的不同表中使用。这是在实例加载时从db筛选作业\触发器的重要条件。