6

Quartz のメソッド Scheduler.getCurrentlyExecutingJobs() は明らかにクラスター対応ではありません。実行中のすべてのジョブのリストを取得するために人々はどのような方法を使用していますか?

4

2 に答える 2

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()
        }
    }
}
于 2013-06-21T18:51:15.917 に答える
-1

データベースに直接アクセスする方法もあると思いますが、API がそれを完全に処理するため、少し危険です。

この目的のために Jira に課題があります。彼らの結論は、クラスター対応をしたい場合は、スケジューリングメカニズムをオーバーホールする必要があるということです。

http://jira.opensymphony.com/browse/QUARTZ-372を参照できます。

于 2009-10-09T06:40:39.550 に答える