簡體   English   中英

由於@Poller,Spring Integration @Scheduled 無法正常工作

[英]Spring Integration @Scheduled not working due to @Poller

我有一個 Spring Boot / Spring Integration 應用程序正在運行,該應用程序在 Spring Integration 中使用@Poller並且在一個大部分不相關的類中的另一個方法上使用@Scheduled @Poller用於輪詢 FTP 服務器以獲取新文件。 但是我發現@Poller似乎在某種程度上干擾了我的@Scheduled方法。

@Poller具有 maxMessagesPerPoll maxMessagesPerPoll = -1以便它可以處理盡可能多的文件。 但是,當我第一次啟動我的應用程序時,FTP 服務器上有超過 100 個文件,因此它將全部處理。 我發現,如果正在處理這些文件,那么@Scheduler將完全停止觸發。

例如,如果我將我的@Scheduled設置為每毫秒觸發一次fixedDelay = 1 ,然后啟動我的應用程序,@ @Scheduled方法將觸發幾次,直到@Poller觸發並開始處理消息,此時我的@Scheduled方法完全停止觸發。 我假設只是有一些任務隊列正在被@Poller填充,所以我只需要等待所有消息都被處理,但即使在@Poller完全完成並處理了所有文件之后, @Scheduled方法仍然根本不會觸發。

我的想法是,可能有一些任務隊列正在被@Poller填充,這破壞了我的@Scheduled方法,但如果是這樣,我仍然看不到任何方法可以為不同的任務隊列使用單獨的任務隊列方法,或用於自定義或修復此問題的任何其他可能選項。

有誰知道我的@Scheduled方法可能會發生什么,我該如何解決這個問題?

@Poller

    @Bean
    @InboundChannelAdapter(channel = "ftpChannel", poller = @Poller(cron = "0/5 * * ? * *", maxMessagesPerPoll = "-1"))
    public MessageSource<InputStream> myMessageSource() {
        //Build my message source
        return messageSource;
    }

@Scheduled

@Scheduled(fixedDelay = 6000)
public void myScheduledMethod(){
  //Do Stuff
}

他們確實為他們的調度程序taskScheduler使用相同的 bean 名稱。

如果您有 10 個或更多輪詢器(Spring Integration 配置的默認調度程序 bean 默認池大小為 10),這應該只是一個問題。 一個常見的錯誤是有許多隊列通道(默認情況下,它們一次保持調度程序線程一秒鍾)。

如果你只有一個輪詢器,而不是很多隊列通道,我無法解釋為什么你會出現線程飢餓。

您可以增加池大小 - 請參閱配置任務計划程序

或者您可以在ScheduledAnnotationBeanPostProcessor中使用不同的調度程序。

在我們的例子中,inbound-channel-adapter 使用 Poller 來訪問來自 IMAP 服務器的郵件 - 但是當它輪詢帶有大附件的電子郵件時,它會阻止 @Scheduled 使用的線程,因為它只使用單個線程進行調度任務。 所以我們設置了 Spring 屬性 spring.task.scheduling.pool.size=2 - 現在允許 @Scheduled 方法在不同的線程中運行,即使在嘗試從 IMAP 獲取郵件時輪詢器被阻塞(在不同的線程中)服務器

正如已經指出的那樣,該問題與具有相同名稱的任務調度程序有關,盡管即使輪詢器少於 10 個也可能發生此問題。 Spring Boot 自動配置為調度程序提供默認池大小 1,並且此調度程序的注冊可能發生在 Spring Integration 提供的taskScheduler注冊之前。

通過Spring Integration 屬性配置任務調度程序並沒有幫助,因為這個 bean 根本沒有注冊。 但是提供具有調整池大小的TaskScheduler實例,通過spring.task.scheduling.pool.size屬性更改自動配置調度程序的池大小或排除TaskSchedulingAutoConfiguration應該可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM