2012-07-19 202 views
7

我有cron表達式觸發彈簧集成流程類似如下:春季集成+ 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> 

它工作正常。但是現在我必須擴展實現以使其集羣就緒(在同一時間點只在一個集羣節點上執行作業)。

我希望在集羣模式下使用Quartz框架(在數據庫中保持作業狀態)來觸發這個集成流程。 Quartz提供了一個開箱即用的解決方案。唯一的問題是如何將Quartz與現有的in-channer-adaptor集成? 「輪詢器」的「觸發器」屬性只接受org.springframework.scheduling.Trigger的子類。我無法在「輪詢器觸發器」和Quartz框架之間找到任何橋樑。

非常感謝提前!

回答

6

這裏有一種方法......

入站適配器上的自動啓動屬性設置爲false。

創建一個自定義觸發,僅觸發一次,立即...

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; 
    } 
} 

在您的石英工作,去觸發和SourcePollingChannelAdapter參考。

當石英觸發火災,有石英工作

  1. adapter.stop()
  2. trigger.reset()
  3. adapter.start()
+0

如果有人絆倒了這一點 - 執行加里的解決方案,以及一個測試來演示使用,可以在[本回購]中找到(https://github.com/vpavic/spring-integration-quartz -橋)。 – 2016-07-23 14:47:52

0

試圖整合石英和彈簧如你所建議,但面臨另外兩個問題:

1.)IncompatibleClassChangeError異常當使用Quartz 2.x和Spring 3.x.這是一個已知的問題,但我沒有找到任何解決方案。

2.)將其他spring bean注入到Quarz作業實例中。我找到了一些解決方案,但沒有人爲我工作。我已經試過了一個使用

<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」屬性會使作業再次運行。

+0

爲問題 1)降級石英temprary溶液到v1.8.5 2)我的觀察:如果有使用「schedulerContextAsMap」方法(像ClassCastException異常從上下文到作業豆的注入過程中的任何的異常)沒有異常由Spring框架引發,並且沒有記錄任何錯誤。這項工作只是沒有開始。在我的情況下,我期望注入的輸入端點的類將是FtpInboundFileSynchronizingMessageSource,但注入的對象的類型是SourcePollingChannelAdapter。 – marc7 2012-07-24 08:10:08

+0

是的 - 對不起,我的錯字 - 修復。 – 2013-06-25 08:43:08

2

Gary的解決方案。這是我的Spring上下文:

<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(); 
} 

}

作爲下一步該Spring上下文必須進行重構,以取代schedulerContextAsMap的使用更靈活一些,並能夠定義更多的工作來激活和停用許多不同的端點。

感謝加里到目前爲止!

+0

順便說一句,對於任何人都會遇到這樣的問題:Quartz 2與Spring 3一起工作,請點擊此鏈接:http://stackoverflow.com/a/9866152/767530 – 2014-09-17 14:41:39