7

我有一個隊列通道和一個帶有從該隊列讀取的輪詢器的服務激活器。我想要配置說「我想要50個線程輪詢該隊列,並且每次輪詢並獲取消息時,在此線程上調用服務激活器指向的服務。」彈簧集成 - 併發服務激活器

該服務沒有@Async註釋,但是無狀態且安全的以併發方式運行。

下面是否會這樣做?是否有其他的優選方式來實現這一目標?

<int:channel id="titles"> 
    <int:queue/> 
</int:channel> 

<int:service-activator output-channel="resolvedIds" ref="searchService" method="searchOnTitle" input-channel="titles"> 
    <int:poller fixed-delay="100" time-unit="MILLISECONDS" task-executor="taskExecutor"></int:poller> 
</int:service-activator> 

<task:executor id="taskExecutor" pool-size="50" keep-alive="120" /> 

回答

8

是的我認爲它是做你想做的。一旦你引入了QueueChannel,交互就變成了異步 - 你不需要@Async。如果您沒有明確設置輪詢器,它將使用默認輪詢器。

你所概述的是實現它的最好方法。您也可以考慮對隊列大小加以限制 - 以免在跟上製作者的時候出現延遲,這不會導致內存不足問題。如果指定了大小,則通道上的發送呼叫將被阻止 - 充當節流閥。

您擁有的配置將按預期工作。唯一的問題是,一旦開始爲每個端點創建執行者和輪詢器,就很難找出整個應用程序的最佳配置。對於一些特定的步驟可以做這種優化 - 但不是針對所有端點(沒有任何問題表明你正在做,只是認爲我會提高它。)