配置任務排程器

在 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 所做的那樣。

有關更多資訊,另請參閱錯誤處理

© . This site is unofficial and not affiliated with VMware.