配置任務排程器

在 Spring Integration 中,ApplicationContext 扮演著訊息匯流排的核心角色,您只需要考慮幾個配置選項。首先,您可能希望控制核心的 TaskScheduler 例項。可以透過提供一個名為 taskScheduler 的 bean 來實現。這也定義為一個常量,如下所示

IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME

預設情況下,Spring Integration 依賴於 ThreadPoolTaskScheduler 例項,如 Spring Framework 參考手冊的任務執行和排程部分所述。預設的 TaskScheduler 會自動啟動一個包含十個執行緒的執行緒池,但請參閱全域性屬性。如果您提供自己的 TaskScheduler 例項,則可以將其 'autoStartup' 屬性設定為 false 或提供自己的執行緒池大小值。

當輪詢消費者在其配置中提供明確的任務執行器引用時,處理器方法的呼叫會在該執行器的執行緒池中發生,而不是在主排程器執行緒池中。但是,如果端點的輪詢器沒有提供任務執行器,則它將由主排程器的執行緒之一呼叫。

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

在 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`s 處理,就像框架提供的預設 `TaskScheduler bean 那樣。

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