使用Quartz获取集群中所有当前正在执行的作业的列表

时间:2009-06-29 14:33:42

标签: java-ee quartz-scheduler

石英中的方法Scheduler.getCurrentlyExecutingJobs()显然不支持群集。人们用什么方法来获取所有正在执行的工作的列表?

2 个答案:

答案 0 :(得分:4)

看起来很难对调度机制进行大修。

所以,这就是我如何直接检查表格 - 如果需要,可以添加组支持:

class QuartzClusterJobStatusService
{
    def quartzScheduler

    boolean isJobRunning(String job) {
        return isJobRunningHere(job) || isJobRunningElsewhere(job)
    }

    boolean isJobRunningHere(String job) {
        for (JobExecutionContext j : quartzScheduler.getCurrentlyExecutingJobs()) {
            if (new JobKey(job,"GRAILS_JOBS").equals(j.jobDetail.key)) {
                return true
            }
        }
        return false
    }

    boolean isJobRunningElsewhere(String job) {
        JobStoreSupport js = quartzScheduler.sched.resources.jobStore
        if (!js.isClustered()) {
            return false
        }
        Connection conn = DBConnectionManager.getInstance().getConnection(js.getDataSource());
        PreparedStatement stmt = null
        try {
            stmt = conn.prepareStatement("SELECT 1 FROM " + js.getTablePrefix() + "FIRED_TRIGGERS where JOB_NAME = ?")
            stmt.setString(1, job)
            ResultSet rs = stmt.executeQuery()
            return rs.next()
        } finally {
            if (stmt != null)
                stmt.close()
        }
    }
}

答案 1 :(得分:0)

我认为一种方法是直接访问数据库,尽管它有点冒险,因为API完全处理了这个。

他们的Jira为此目的存在问题。他们的结论是,如果他们想要提供群集感知,你需要彻底改变调度机制。

您可以参考http://jira.opensymphony.com/browse/QUARTZ-372