如何解決后端項目啟動時拋出 task supervisor timed out 異常
現象描述
后端項目啟動時拋出如下異常,但是該后段項目能正常啟動並注冊到注冊中心,不影響功能使用。
2018-10-10 09:39:12.407 ERROR 8916 --- [DiscoveryClient-0] c.n.d.TimedSupervisorTask : task supervisor timed out
java.util.concurrent.TimeoutException: null
at java.util.concurrent.FutureTask.get(FutureTask.java:205) ~[?:1.8.0_172]
at com.netflix.discovery.TimedSupervisorTask.run(TimedSupervisorTask.java:63) [eureka-client-1.7.2.jar:1.7.2]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_172]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_172]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_172]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_172]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_172]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_172]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_172]
原因分析
項目啟動初始化時,會啟動兩個定時任務,一個是向eureka注冊,即心跳的線程,另一個是從eureka獲取服務注冊列表,即刷新注冊列表緩存的線程,上述兩個線程都是每30s執行一次,默認超時時間都為30s,所以當30s未執行完該任務是,便會拋出Timeout的異常。發送心跳的任務比較簡單,一般不會超時。而獲取注冊列表的任務,耗時較久。
由於注冊中心是所有服務通信的基礎,所以部署在多個服務器的應用在通信時可能會比較耗時,往往會發生超時。
處理步驟
將該后段項目的 bootstrap.yml 文件中的 client.registryFetchIntervalSeconds 調大,建議調為 30。