設定任務排程器

在 Spring Integration 中,ApplicationContext 扮演著訊息匯流排的中心角色,您只需要考慮幾個設定選項。首先,您可能想要控制中央 TaskScheduler 實例。您可以透過提供名為 taskScheduler 的單一 bean 來完成此操作。這也定義為常數,如下所示

IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME

預設情況下,Spring Integration 依賴 ThreadPoolTaskScheduler 的實例,如 Spring Framework 參考手冊的 任務執行和排程 章節中所述。該預設 TaskScheduler 會自動啟動並具有十個執行緒的池,但請參閱 全域屬性。如果您改為提供自己的 TaskScheduler 實例,則可以將 'autoStartup' 屬性設定為 false 或提供您自己的池大小值。

當輪詢消費者在其設定中提供明確的任務執行器參考時,處理器方法的調用會發生在該執行器的執行緒池中,而不是主排程器池中。但是,當端點的 poller 沒有提供任務執行器時,它會由主排程器的其中一個執行緒調用。

不要在 poller 執行緒上執行長時間執行的任務。請改用任務執行器。如果您有很多輪詢端點,則可能會導致執行緒飢餓,除非您增加池大小。此外,輪詢消費者預設的 receiveTimeout 為一秒。由於 poller 執行緒會在此時間內阻塞,因此我們建議您在存在許多此類端點時使用任務執行器,再次是為了避免飢餓。或者,您可以減少 receiveTimeout
如果端點的輸入通道是基於佇列的(即,可輪詢的)通道之一,則該端點是輪詢消費者。事件驅動消費者是那些具有輸入通道的消費者,這些輸入通道具有分派器而不是佇列(換句話說,它們是可訂閱的)。此類端點沒有 poller 設定,因為它們的處理器是直接調用的。

在 JEE 容器中執行時,您可能需要使用 Spring 的 TimerManagerTaskScheduler,如 此處 所述,而不是預設的 taskScheduler。為此,請為您的環境定義具有適當 JNDI 名稱的 bean,如下列範例所示

<bean id="taskScheduler" class="org.springframework.scheduling.concurrent.DefaultManagedTaskScheduler">
    <property name="jndiName" value="tm/MyTimerManager" />
    <property name="resourceRef" value="true" />
</bean>
當在應用程式內容中設定自訂 TaskScheduler 時(例如上述提及的 DefaultManagedTaskScheduler),建議為其提供 MessagePublishingErrorHandlerintegrationMessagePublishingErrorHandler bean),以便能夠將例外狀況作為 ErrorMessage 處理並發送到錯誤通道,就像框架提供的預設 TaskScheduler bean 一樣。

另請參閱 錯誤處理 以取得更多資訊。