0

私はJboss-seam2.2.2.Finalを使用しており、クォーツの仕事がいくつかあります。アプリケーションの実行中に、特定のジョブが実行されているかどうかを確認する必要があります。

私はすでにジョブにアクセスできますが、それぞれにクォーツによって作成された名前が付いています。シームインジェクションのコードは次のとおりです。

    @In("org.jboss.seam.async.dispatcher")
    private QuartzDispatcher quartzDispatcher;

実行中のジョブを取得するために、私はこのコードを持っています:

    Scheduler scheduler = quartzDispatcher.getScheduler();
    List<JobExecutionContext> currentJobs;
    currentJobs = scheduler.getCurrentlyExecutingJobs();
    for (JobExecutionContext jobCtx: currentJobs){
        System.out.println(jobCtx.getJobDetail().getName());
    }

jboss-seamを使用してクォーツジョブに名前を付ける方法を知っている人はいますか?私はいくつかの調査を行っており、jiraでこのチケットを見つけました:https ://issues.jboss.org/browse/JBSEAM-4399

4

1 に答える 1

1

Seamは、ジョブごとにUUIDベースの一意の名前を生成します。これをオーバーライドする直接的な方法はありません。あなたの選択肢は次のとおりです。

  1. 見つかったパッチを使用します。これには、カスタマイズされたコードが追加されたカスタムSeamライブラリを構築する必要があります。

  2. OOTBクォーツディスパッチャーを独自のカスタムディスパッチャーでオーバーライドし、scheduleWithQuartzServiceメソッドをオーバーライドし、独自のスキームを使用してジョブに名前を付けます(ソースコードを見ると、ジョブの新しい一意の名前を生成するメソッドがorg.jboss.seam.async.QuartzDispatcher呼び出されていることがわかります。nextUniqueName()他の場所からジョブ名を取得する必要があります。最終的には、見つけたパッチで行われるのと同じ方法で、注釈を介して取得します)。

  3. 名前に基づいてジョブが実行されているかどうかを確認する代わりにorg.quartz.JobListener、グローバルハッシュテーブルなどでジョブの実行の開始と終了を実装および登録するクォーツイベントリスナーを作成できます。次に、名前で検索するのではなく、ハッシュテーブルでジョブを検索してステータスを取得します。ただし、これはスケジューラーがクラスター化されていない場合にのみ機能します(quartzはローカルノードのリスナーのみに通知し、他のノードはジョブがトリガーされたことを認識しません)。

于 2013-05-23T15:14:03.530 に答える