8

次のような cron 式によってトリガーされる春の統合フローがあります。

<int-ftp:inbound-channel-adapter id="my-input-endpoint" ...>
    <int:poller trigger="my-trigger"/>
</int-ftp:inbound-channel-adapter>

<bean id="my-trigger"
   class="org.springframework.scheduling.support.CronTrigger">
  <constructor-arg value="0 * * * * *" />
</bean>

それは正常に動作します。しかし今は、実装を拡張してクラスター対応にする必要があります (ジョブは、同時に 1 つのクラスター ノードでのみ実行されます)。

この統合フローをトリガーするために、Quartz フレームワークをクラスター モード (データベース内のジョブ ステータスを保持する) で使用したいと考えています。Quartz は、すぐに使用できる美しいソリューションを提供します。唯一の問題は、Quartz を既存の inbout-channer-adaptor と統合する方法ですか? 「ポーラー」の「トリガー」属性は、org.springframework.scheduling.Trigger のサブクラスのみを受け入れます。「ポーラー トリガー」と Quartz フレームワークの間の橋渡しが見つかりませんでした。

よろしくお願いします!

4

4 に答える 4

8

これが1つの方法です...

inbound-adapter の auto-startup 属性を false に設定します。

すぐに 1 回だけ起動するカスタム トリガーを作成する...

public static class FireOnceTrigger implements Trigger {

    boolean done;

    public Date nextExecutionTime(TriggerContext triggerContext) {
        if (done) {
            return null;
        }
        done = true;
        return new Date();
    }

    public void reset() {
        done = false;
    }
}

Quartz ジョブで、トリガーと への参照を取得しますSourcePollingChannelAdapter

クォーツトリガーが発射されたら、クォーツジョブを持っています

  1. アダプター.ストップ()
  2. トリガー.リセット()
  3. アダプタ.開始()
于 2012-07-19T15:49:01.693 に答える
2

Garyの作品からの解決策。この私の春のコンテキスト:

<int-ftp:inbound-channel-adapter id="my-endpoint"
        auto-startup="false">
    <int:poller trigger="my-endpoint-trigger"/>
</int-ftp:inbound-channel-adapter>


<bean id="my-endpoint-trigger" class="com.my.FireOnceTrigger"/>

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

    <property name="triggers">
        <list>
            <ref bean="my-job-trigger" />
        </list>
    </property>

    <property name="schedulerContextAsMap">
        <map>
            <entry key="inputEndpoint"><ref bean="my-input-endpoint" /></entry>
            <entry key="inputEndpointTrigger"><ref bean="my-endpoint-trigger" /></entry>
        </map>
    </property>
</bean>

<bean id="my-job-trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="cronExpression" value="0 * * * * ?" />
    <property name="jobDetail" ref="my-job" />
</bean>

<bean name="my-job" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.my.MyActivatorJob " />
</bean>

および MyActivatorJob クラス:

public class MyActivatorJob extends QuartzJobBean implements {

private AbstractEndpoint inputEndpoint;

private FireOnceTrigger inputEndpointTrigger;

public void setInputEndpoint(final AbstractEndpoint pInputEndpoint) {
    this.inputEndpoint = pInputEndpoint;
}

public void setInputEndpointTrigger(final FireOnceTrigger pInputEndpointTrigger) {
    this.inputEndpointTrigger = pInputEndpointTrigger;
}

@Override
protected void executeInternal(final JobExecutionContext pParamJobExecutionContext)
throws JobExecutionException {

    inputEndpoint.stop();
    inputEndpointTrigger.reset();
    inputEndpoint.start();
}

}

次のステップとして、この春のコンテキストをリファクタリングして、schedulerContextAsMap の使用をより柔軟なものに置き換え、多くの異なるエンドポイントをアクティブ化および非アクティブ化するより多くのジョブを定義できるようにする必要があります。

ゲイリー、今までありがとう!

于 2012-07-26T13:23:33.157 に答える
0

あなたが提案したようにクォーツとスプリングを統合しようとしましたが、他に2つの問題に直面しました:

1.) Quartz 2.x および Spring 3.x を使用する場合の IncompatibleClassChangeError 例外。これは既知の問題ですが、その解決策は見つかりませんでした。

2.) Quarz ジョブ インスタンスへの他の Spring Bean の注入。いくつかの解決策を見つけましたが、誰も私のために働きません。を使用して試してみました

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobFactory">
        <bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory" />
    </property>

    <property name="triggers">
        ...
    </property>

    <property name="schedulerContextAsMap">
        <map>
            <entry key="inputEndpoint" value-ref="my-endpoint" />
        </map>
    </property>
</bean>

他の Bean をジョブに挿入しますが、このプロパティを SchedulerFactoryBean に追加した後、ジョブは実行されません (例外は表示されません)。プロパティ「schedulerContextAsMap」を削除すると、ジョブが再び実行されます。

于 2012-07-23T14:59:27.617 に答える
0

まだ試していませんが、Quartz 2 と Spring の互換性の問題は Spring 3.1.1 で修正されているようです。https://jira.springsource.org/browse/SPR-8889を参照

于 2013-07-16T06:59:42.970 に答える