quartzのScheduler.getCurrentlyExecutingJobs()メソッドはクラスタ対応ではありません。実行中のすべてのジョブのリストを取得するために、どの方法を使用していますか?Quartzでクラスタ内で現在実行中のすべてのジョブのリストを取得します
6
A
答えて
0
私は、APIが完全にそれを処理するので少し危険ですが、私は直接データベースにアクセスすることですと思います。
この目的のためにJiraに問題があります。彼らがクラスタを認識できるようにするには、スケジューリングメカニズムを見直す必要があります。あなたはhttp://jira.opensymphony.com/browse/QUARTZ-372
3
を参照することができます
は、スケジューリング機構は、いつでもすぐに起きていないオーバーホールように見えます。
だから、ここで私が直接テーブルをチェックしてる方法です - あなたはそれをしたい場合は、グループのサポートを追加します。
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()
}
}
}