2012-02-29 12 views
1

私のアプリケーションでは、毎日1000回以上のトリガーが発生することがあります。SchedulerFactoryの1つのインスタンスには、いくつのトリガーがありますか?

  • 朝(午前9時)
  • 午後(午後1時)
  • 夕方(午後6時)
  • 夜(午後10時)

とのそれぞれに:これらのそれぞれは、4つのカテゴリーに分類されますこれらの時間は、トリガの発砲された100があります。以下のコード

SchedulerFactory schdFact = new StdSchedulerFactory(); 
Scheduler schd; 
for(ecah morningSchedulers){ 
    // some logic for instantiating trigger 
    AbstractTrigger trigger = (AbstractTrigger) newTrigger().withSchedule(cronSchedule("0  0"+mAlert+"0,0,0 * * ?")).build(); 
    trigger.setStartTime(strtDat); 
    trigger.setEndTime(endDat); 
    final JobDetail job = newJob(AlertJob.class).build(); 
    schd.scheduleJob(job, trigger); 
} 

が、私はここに2つの質問

  1. を持っている私は、forループ内のスケジューラをインスタンス化や外部と同じスケジューラに多くのトリガーをスケジュールする必要があります。すなわちschd = schdFact.getScheduler();この行はどこに書きますか?(ループの内側または外側)

  2. これらのトリガーの一部を再スケジュールする必要があります。すなわち、何らかの状態で停止し、再び開始する。

答えて

0

SchedulerFactoryの単一のインスタンスは、どのように多くのトリガーを持つことができますか?

どのように多くの仕事クォーツが実行できる:

公式FAQで同様の質問がありますか?

これは答えが難しい質問です...答えは基本的に「それは依存しています」。 [...]したがって、トリガとジョブの数の制限要因は「保存」でき、モニタは実際にはJobStoreで使用できるストレージ容量(RAM容量またはディスク容量のいずれか)です。

[...]時間にいつでも実行していることができるジョブの実際の数は、スレッドプールのサイズによって制限されています

はまたこのことについて覚えておいてください。プールに5つのスレッドがある場合、一度に5つ以上のジョブを実行することはできません。

あなたがの数千人が(あなたが混乱のトリガーとトリガーの実行ではありません?)をトリガしている場合は、JDBCのストレージを考えます。しかし、わずか数回のトリガーしかなくても、1日に数回走っていれば、RAMストアで十分です。

は、私は間違いなく、アプリケーション全体のためだけ単一スケジューラを持って外forループや内部のスケジューラをインスタンス化し、同じスケジューラ

に多くのトリガーをスケジュールする必要があります。 1つのアプリケーションに複数のスケジューラーを持つことはまれです。Utilizing Multiple (Non-Clustered) Scheduler Instancesを参照してください。

スケジューラを1回作成し、シングルトンとして扱います。

これらのトリガーの一部を再スケジュールする必要があります。すなわち、何らかの状態で停止し、再び開始する。

これは、再度、文書番号Updating an existing Triggerで説明されています。基本的には、トリガーキーを知っておく必要があります。ただ与えられた単一の時間にジョブを実行したい場合はところで

// retrieve the trigger 
Trigger oldTrigger = sched.getTrigger(triggerKey("oldTrigger", "group1"); 

// obtain a builder that would produce the trigger 
TriggerBuilder tb = oldTrigger.getTriggerBuilder(); 

// update the schedule associated with the builder, and build the new trigger 
// (other builder methods could be called, to change the trigger in any desired way) 
Trigger newTrigger = tb.withSchedule(simpleSchedule() 
    .withIntervalInSeconds(10) 
    .withRepeatCount(10) 
    .build(); 

sched.rescheduleJob(oldTrigger.getKey(), newTrigger); 

、簡単にAPIがあります。代わりに:

newTrigger(). 
    withSchedule(
    cronSchedule("0  0"+mAlert+"0,0,0 * * ?") 
). 
    build() 

あなたは、単に言うことができます:

newTrigger(). 
    withSchedule(
    dailyAtHourAndMinute(mAlert, 42) 
). 
    build(); 

は公式チュートリアルのLesson 6: CronTriggerを見てください。

+0

リンクありがとうございます。はい、何千ものトリガーがあります。トリガーとトリガーの実行はどういう意味ですか?私のアプリケーションは、私が定義したこれらの4回で患者にSMSを送るでしょう。そして各ユーザーにはいくつかの処方箋があります。これらの処方にはそれぞれ開始日と終了日があります。だからこの場合、私はいくつかのトリガーを正しく開始しなければなりませんか?それぞれに異なるデータがあるため、タイミングは類似しています(午前9時、午後5時、午後10時)。では、これらのトリガーをデータベースなどに保存する必要がありますか?それは、jdbcストレージの意味です。それがどのように私を助けますか? – Preethi

+0

@Preethi:数十万人の患者に到達すると、トリガーは多くのメモリを占有します。また、再起動後にトリガーを再作成することについて覚えておく必要があります。そして、その期間中にあなたのアプリケーションがダウンしていたら?あなたの一般的なアプローチは非常に良いですが、4つのトリガ(1時間に1つ)だけを考慮し、所定の時間に薬を飲むべきすべての患者にバッチSMSを送信してください。これはより良いスケールになるかもしれません。 –

関連する問題