2016-07-28 378 views
0

我的要求是每30秒輪詢一次MongoDB以查找集合中的任何數據更改。我已經使用Java CompletableFuture.runAsync作爲下面捕獲的代碼實現此功能。我有測試運行一天的程序,它似乎工作正常。Java CompletableFuture.runAsync回覆......任何潛在風險?

我的問題是:

  1. 會不會有OOM「堆棧溢出」異常的任何潛在風險,如果我繼續運行很長一段時間?
  2. 我的線程池大小爲3,從日誌文件中我發現前幾個2運行使用pool-1-thread-1和pool-1-thread-2,從第三次運行開始,它不斷重用pool-1-thread-3一段時間,然後在一段時間內重新使用pool-1-thread-1/pool-1-thread-2 ......會有什麼潛在的問題或是否正常?

    private static ExecutorService executor = Executors.newFixedThreadPool(3); 
    
    private void watch(){ 
        CompletableFuture<Void> watchForLeadershipChange = 
         CompletableFuture.runAsync(() -> pollForChanges(), executor); 
    } 
    
    private void pollForChanges() { 
        //Query MongoDB collection and do some logic 
    
        TimeUnit.SECONDS.sleep(30); 
        watch(); 
    } 
    
+1

爲什麼不'ScheduledExecutorService'?或者只是一個'while()'循環? –

+0

至於被不同poolthreads拾取的任務:是的,這是正常的。 – Fildor

回答

1
  1. 會不會有,如果我繼續運行很長一段時間OOM「堆棧溢出」異常的任何潛在的風險?否。雖然pollForChanges()調用watch(),但後續調用pollForChanges()在另一個線程中可能異步發生。無論哪種情況,它都會有一個新的堆棧指​​針。
  2. 我的線程池大小爲3,從日誌文件中我發現,最初的幾個2個運行...哪個線程ExecutorService選是ExecutorService的實現細節。你所觀察到的行爲並沒有什麼奇怪或意外的。

之所以這麼說的 - 這是在評論中指出,做一些很瑣碎與ScheduledExecutorService的很婉轉地:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

scheduler.scheduleWithFixedDelay(
     () -> queryMongoAndDoSomeLogic(), 
     0, 
     30, 
     TimeUnit.SECONDS);