2014-02-23 102 views
0

如果使用任務執行器定義Spring Integration通道,則會使用線程池來處理消息。如果服務激活器或變換器端點組件從此內部接收消息通道,將會實例化一個端點組件池,每個線程一個?如果這不是默認行爲,則需要進行哪些配置才能實現此目的?彈簧集成:用於避免丟失消息的策略

這是兩個重要的原因:

  1. ,以便服務激活器/變壓器接收,郵件將不會成爲瓶頸。

  2. 爲確保端點組件處理內部通道使用的同一線程中的消息,因此它們是同一事務的一部分。如果是這種情況,並且通道使用JMS持久保存,則消息不會丟失。否則,如果端點在單獨的事務中運行,則一旦消息傳遞到端點組件,如果JVM發生故障,則消息在通道上持續存在的事實將無濟於事。

感謝

回答

1

否;無論輸入通道上的線程如何,每個端點都有一個實例。

  1. 您通過仔細設計服務(通常使其無狀態)來避免「瓶頸」。
  2. 目前尚不清楚你的意思;如果通道由JMS支持,則輸出端的每個線程都可以獲得自己的事務,並且在發生服務故障時,消息將回滾到隊列中。這與一個簡單的執行器通道完全不同(事務不能工作,並且有一個單獨的實例也無濟於事)。

也許如果你可以描述一個特定的用例/配置,有人可以提供一些建議。

+0

下面是一個例子來說明我的問題: – user1052610

+0

這裏是一個例子來澄清我的問題:內部通道是由任務執行者定義的。通過輪詢數據庫的入站通道適配器將消息放置在通道上。變壓器然後從內部通道接收消息。我的理解是內部(執行者)渠道不會成爲任何前面的交易的一部分,但它會開始一個包含變壓器的新交易。在這種情況下,即使通道將消息傳遞給變壓器後出現故障,該消息也不會丟失。它是否正確? – user1052610

+0

爲了澄清上述情況,當我說消息將被保存並且不會丟失時,我指的是一個由jms支持的執行器通道() – user1052610