2016-07-28 2 views
0

Мое требование - опросить MongoDB каждые 30 секунд для любых изменений данных в коллекции. Я использовал Java CompletableFuture.runAsync для реализации этой функции в качестве кода, описанного ниже. У меня есть тест, который запускает программу на один день, и кажется, что она работает нормально.Java CompletedFuture.runAsync recurrsion ... любой потенциальный риск?

Мои вопросы:

  1. Будет ли любой потенциальный риск OOM «переполнение стека» исключение, если я работать в течение длительного времени?
  2. Мой размер потока равен 3, из файла журнала я обнаружил, что первые несколько прогонов используют пул-1-нить-1 и пул-1-нить-2, начиная с третьего прогона и т. Д. Он продолжает повторное использование пул-1-нить-3 в течение некоторого времени, затем повторно использовать пул-1-нить-1/пул-1-нить-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

Что касается задач, которые подбираются разными пул-путями: Да, это нормально. – Fildor

ответ

1
  1. ли бы любой потенциальный риск OOM «переполнение стека» исключение, если я работать в течение длительного времени? № Пока pollForChanges() вызывает watch(), последующие вызовы pollForChanges() происходят асинхронно в (возможно) другом потоке. В любом случае он всегда будет иметь новый указатель стека.
  2. Мой размер ThreadPool 3, из файла журнала я обнаружил, что первые 2 работает ... Какой нить в ExecutorService выбирает является деталью реализации этого ExecutorService. Нет ничего странного или неожиданного в отношении поведения, которое вы наблюдаете.

Все, что было сказано - это очень окольный способ сделать что-то очень тривиальное с ScheduledExecutorService, как было указано в комментариях:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

scheduler.scheduleWithFixedDelay(
     () -> queryMongoAndDoSomeLogic(), 
     0, 
     30, 
     TimeUnit.SECONDS); 
Смежные вопросы