2014-12-10 19 views
0

我們有以下Spring的集成流程:與Spring集成並行富集 - 初始線程失去

JMS消息驅動通道適配器 - > - >的pub/sub通道 - > 3倍 濃縮商簽約 - >聚合器 - > ...

每個富集器都有指定的task-scheduler,所以它們並行工作。

不幸的是,這種方法無法正常工作,因爲原來的JMS線程丟失了。

我預計jms-message-driver-channel-adapteraggregator運行在相同的線程,但aggregator(和以下處理程序)在「最後」豐富的線程中運行。

我該如何做到這一點?我不認爲這寫在spring-int文檔中的任何地方。

添加後加裏的答覆

我決定在更自然的方式來實現這一點:

<int:service-activator method="enrich" input-channel="in" output-channel="out"> 
    <bean class="com.xxx.ParallelEnricher" p:timeoutMs="10000"> 
    <constructor-arg ref="taskExecutor" /> 
    <constructor-arg> 
     <list> 
     <bean class="com.xxx.Enricher1" /> 
     <bean class="com.xxx.Enricher2" /> 
     <bean class="com.xxx.Enricher3" /> 
     </list> 
    </constructor-arg> 
    </bean> 
</int:service-activator> 

凡ParallelEnricher是一個可重用的類稱爲「未來taskExecutor.submit(Runnable接口)」每個豐富和處理超時。 可能是我失去了一些東西,但它會很高興在同一個消息是這樣配置的並行操作:

<int:service-activator method="enrich" input-channel="in" output-channel="out" 
         timeout="10000" task-executor="taskExecutor"> 
    <list> 
    <bean class="com.xxx.Enricher1" /> 
    <bean class="com.xxx.Enricher2" /> 
    <bean class="com.xxx.Enricher3" /> 
    </list> 
</int:service-activator> 

回答

1

一種解決方案是增加一個網關中等流動;這樣,JMS線程將等待來自最終消費者的回覆 - 它必須返回「東西」(只要放棄他的output-channel,並且框架將把回覆返回給網關,在那裏它可以被丟棄)...

<int:service-activator input-channel="fromJMS" output-channel="nullChannel" 
    ref="gw" /> 

<int:gateway default-request-channel="myPubSub" /> 

只要確保最終消費者(在聚合後可能的地方)發送應答(不要緊它是什麼,它會通過它發送到nullChannel被丟棄)。

請注意,該線程將默認等待無限期;如果您需要超時並回滾消息,則需要額外的邏輯。

另一種解決方案是添加第四個用戶,一個簡單的服務, s來自QueueChannel。同樣,最終消費者發送消息來觸發發佈。您需要在pub/sub之前添加一個頭文件,以便爲每個消息添加一個新的頭文件<int:header name="myReleaseTriggerChannel" expression="new ...QueueChannel()"/>;最終消費者向該頭文件發送「something」(可能是簡單的路由器)

此解決方案需要小的用戶代碼(從隊列中接收),但它更容易處理這種超時方式。

+0

嗨加里。感謝您的描述可能的解決方案。我懷疑沒有直接的方法來做到這一點。老實說,我不即使像這個pub/sub channel和aggregator都存在於這個流程中,當我們手動執行這樣的任務(沒有spring-int)時,我們只有:線程池執行程序,調用者線程中的期望和等待邏輯。 XML配置過於複雜且難以理解,我決定以更自然的方式實現這一點(將更新原始帖子的細節) – JavaD 2014-12-12 12:37:45