Безопасно или целесообразно повторно ставить Runnable с тем же исполнителем, если возникает проблема, и я хочу повторить попытку? - PullRequest
2 голосов
/ 18 февраля 2011

Я только что написал этот код в методе run() моего запускаемого файла:

try {
    dbConnection = MyApp.datasource.getConnection();
} catch (SQLException e) {
    logger.log(Level.SEVERE, "Could not obtain a DB connection! Re-enqueuing this task. Message: " + e.getMessage(), e);
    MyApp.executor.execute(this);
    return;
}

Как вы можете видеть, если задача не может получить соединение с БД, она должна повторно поставить себя в очередь, в ту же очередь, в которой она находилась до выполнения.

Я думаю, что это , вероятно, безопасно, но это забавно, и я просто хочу убедиться, что нет никаких ошибок, которые я пропускаю.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 18 февраля 2011

Это нормально, если исполнитель идет.

Но имейте в виду, что сбои могут произойти довольно быстро, и тогда Исполнитель может быстро перезапустить ваш код. Это может привести к сжиганию большого количества процессоров без каких-либо результатов.

Построить принудительные повторные задержки и максимальное количество циклов.

4 голосов
/ 18 февраля 2011
  1. Существует риск возникновения так называемого ядовитого сообщения : задача будет повторяться бесконечно, если SQLException не исчезнет. Вы должны предоставить какой-то счетчик или таймер.

  2. В зависимости от занятости исполнителя (сколько одновременных задач уже запланировано), интервал между попытками может значительно различаться. Вы можете либо использовать 100% ЦП, либо ждать повторных попыток в течение очень долгого времени.

  3. Если из-за происшествия ваша задача parent (та, которая перепланирует себя) ожидает результата вызова child (перепланированного), может возникнуть тупик, когда исполнитель работает только в одном потоке.

  4. Вы используете необработанные поля MyApp, похоже, что это плохой шаблон.

Что касается общей идеи: почему бы просто не иметь цикл в run()? Вы хотите быть более "справедливым" по отношению к другим выполняемым задачам?

...