2016-05-08 3 views
1

У меня есть Java-приложение, которое использует несколько потоков, которые запускаются через заданное время с помощью ScheduledExecutorService. Каждый час начинается поток, выполняет некоторую работу и заканчивается правильно. Но иногда (например, когда HTTP-запрос не работает) этот поток вылетает, и служба-исполнитель больше не запускает такой поток. Затем мне нужно выйти из приложения (с помощью Ctrl-C) и снова перезапустить его.Java-приложение работает некорректно после сбоя потока

Возможно ли, что прерывистая нить прерывает ExecutorService для создания новых потоков? Я не хочу, чтобы всегда проверять, работает ли приложение, или нет, потому что оно работает на моей малине Pi и должно работать 24 часа в сутки.

Возможно, вы сможете помочь мне найти решение моей проблемы!

EDIT:

ExecutorService также работает на своем собственном потоке. Это, как запускаются потоки:

@Override 
public void run() { 
    threadFuture = executorService.scheduleAtFixedRate(new IntervalThread(i, p, c, a), 60, 60, TimeUnit.MINUTES); 
} 

И это нить, которая вызывается каждые 60 минут:

@Override 
public void run() { 

    try { 
     // do some HTTP request here 
     // if an error occurs, catch it and log the error message 
    } catch (Exception e) { 
     LOGGER.error(e.getMessage()); 
    } 
} 

Если поток (что делает HTTP запросы) chrashed, весь ExecutorService больше не работает. Как это возможно, если я поймаю каждое исключение?

+0

Фрагменты кода из 'инициализации ExecutorService' и вашего класса' Runnable' было бы полезно. –

ответ

2

Ваш случай имеет объяснение, так как ScheduledThreadPoolExecutor

Если какое-либо выполнение этой задачи наталкивается исключение, последующие казни подавлены.

Хотя вы выполняете все задания/работу в try{}catch(Exception) блоке, есть случаи, когда Throwable может «убежать» на catch блок:

  1. произошло какой-либо ошибки (например, OutOfMemoryError) ,

  2. Ваш код регистрации LOGGER.error(e.getMessage()); породил исключение при регистрации.

Я бы порекомендовал вам следующую модификацию, чтобы понять, что происходит:

@Override 
public void run() { 
try { 
    try { 
    // do some HTTP request here 
    // if an error occurs, catch it and log the error message 
    } catch (Exception e) { 
    LOGGER.error(e.getMessage()); 
    } 
} catch (Throwable t){ 
    t.printStackTrace(); // this would require redirect output like java -jar my.jar >> error_log.txt 
    // try clean up and exit jvm with System.exit(0); 

}  
+0

Спасибо! Надеюсь, я смогу узнать, что именно не работает правильно. Мне просто нужно, чтобы я мог создать файл * MANIFEST *, чтобы запустить мой .jar правильно :)) – beeef

Смежные вопросы