Para la ejecución de las tareas periódicas, miré a Timer
y ScheduledThreadPoolExecutor
(con un solo hilo) y decidió utilizar este último, porque en el reference for Executors.newSingleThreadScheduledExecutor()
, que dice:¿Por qué un ScheduledExecutorService no ejecuta una tarea nuevamente después de lanzar una excepción?
Nota sin embargo que si esta solo hilo termina debido a una falla durante la ejecución antes del cierre, una nueva tomará su lugar si es necesario para ejecutar tareas posteriores.
Mi plan era utilizar esto como una protección contra excepciones no detectadas en un código de código de vigilancia que quiero controlar otras operaciones. Quería asegurarme y escribí la prueba a continuación, que falló rápidamente. Parece que estaba haciendo suposiciones equivocadas, ¿o algo está mal en mi prueba?
Aquí está el código:
@Test
public void testTimer() {
final AtomicInteger cTries = new AtomicInteger(0);
final AtomicInteger cSuccesses = new AtomicInteger(0);
TimerTask task = new TimerTask() {
@Override
public void run()
{
cTries.incrementAndGet();
if (true) {
throw new RuntimeException();
}
cSuccesses.incrementAndGet();
}
};
/*
Timer t = new Timer();
t.scheduleAtFixedRate(task, 0, 500);
*/
ScheduledExecutorService exe = Executors.newSingleThreadScheduledExecutor();
exe.scheduleAtFixedRate(task, 0, 500, TimeUnit.MILLISECONDS);
synchronized (this) {
try {
wait(3000);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
exe.shutdown();
/*
t.purge();
*/
Assert.assertEquals(cSuccesses.get(), 0);
Assert.assertTrue(cTries.get() > 1, String.format("%d is not greater than 1. :(", cTries.get()));
}
Lo sé, puedo envolver una trampa (Throwable) alrededor de cosas, pero mi plan era de alguna manera protegerme de mí mismo. –
sería problemático que un código de marco como este suponga que puede reiniciar de manera segura un trabajo fallido; el hecho de que fallara con una excepción significa que los datos podrían haberse quedado en cualquier tipo de estado y, potencialmente, no sería seguro reiniciarlo el trabajo. –
La cita acerca de cómo iniciar un nuevo hilo es permitir que otros trabajos continúen ejecutándose, incluso si uno falla –