1

デフォルトのクラスを拡張して、いくつかのメンバー変数とメンバーメソッドを追加して、独自のジョブクラスを作成しました。ジョブがトリガーされ、非常に長い間実行されているのを見ました。

JobDetail ではなく Job Instance を取得したかっただけで、自分で定義したメンバー メソッドを呼び出したり、メンバー変数にアクセスしたりしたかったのです。

これを達成する方法を教えてください。

ありがとう、カシール

4

1 に答える 1

0

おそらくクォーツはリモートスケジューリングモード(つまりクラスター)と互換性があるため、そのような方法はありません。

しかし、単一のサーバー/アプリケーションコンテキストで使用している場合は、おそらく独自の JobFactory ( http://quartz-scheduler.org/api/2.1.5/org/quartz/simpl/SimpleJobFactory.html ) を実装できます。インスタンスの作成をスーパークラスに委譲し、そのインスタンスを何らかの形でマップなどに登録するだけです。次に、マップ キーをループして、見ているインスタンスを見つける必要があります。

このようなソリューションではメモリリークに注意してください


簡単な例:

春の設定ファイルで:

<!-- quartz scheduler -->
<bean id="orchestration-api-quartz-factory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="configLocation" value="classpath:spring/quartz.properties"/>
    <property name="jobFactory">
        <bean class="service.scheduler.SpringServiceJobFactory"/>
    </property>
</bean>

そして、Factory の基本的な実装:

/**
 * このジョブ ファクトリは、JobClass に対応する Spring Bean を見つけようとします。
 *
 * @author マチュー・ポス
 */
public class SpringServiceJobFactory extends SpringBeanJobFactory implement JobFactory {

    @Autowired
    プライベート ApplicationContext コンテキスト。

    /**
     * {@inheritDoc}
     */
    @オーバーライド
    保護されたオブジェクト createJobInstance(最終 TriggerFiredBundle バンドル)
                                       例外をスローします {
        // Bean インスタンスを作成または取得する
        オブジェクト Bean = this.context.getBean(bundle.getJobDetail().getJobClass());

        // Bean で必要なことを行います
        // ただし、何をしたかを覚えておいてください。
        // メモリ リークが発生します !!!

        // myConcurrentMap.put("job.key", bean);

        豆を返します。
    }

}

ハイ

于 2012-12-06T17:26:44.970 に答える