Мое требование - опросить MongoDB каждые 30 секунд для любых изменений данных в коллекции. Я использовал Java CompletableFuture.runAsync для реализации этой функции в качестве кода, описанного ниже. У меня есть тест, который запускает программу на один день, и кажется, что она работает нормально.Java CompletedFuture.runAsync recurrsion ... любой потенциальный риск?
Мои вопросы:
- Будет ли любой потенциальный риск OOM «переполнение стека» исключение, если я работать в течение длительного времени?
Мой размер потока равен 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(); }
Почему не 'ScheduledExecutorService'? Или просто цикл while()? –
Что касается задач, которые подбираются разными пул-путями: Да, это нормально. – Fildor