2016-07-28 380 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);