tiempo Task Timer java causada por problemas de producción
El otro problema es que el equipo de producción en ese país, sino porque tengo que participar en las revisiones de código de este módulo fue también señalado al lugar en cuestión, los cambios en ScheduledExecutorService o ensayo propuesto. Sin embargo, el grado de atención suficiente pago retroactivo, lo que lleva a problemas de producción planteadas.
análisis de código Problema
En el que la siguiente parte del código.
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
try {
//TODO
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 10*1000, 5000);
De esta manera, de un solo subproceso, hay un problema será cuando hay múltiples tareas programadas: Una tarea si el tiempo de ejecución es demasiado largo, dirigirá la tarea B se retrasa la hora de inicio!
Otro problema, el problema debe ser parte del diseño: si el hilo tarea cuando se realiza una cola de tareas, la tarea se produce una excepción, hará que el hilo para terminar debido a cabo del cuerpo del bucle, es decir, de temporizador ha dejado de funcionar!
Por lo tanto, este lugar una vez lanzada, a continuación, hacer que el hilo para terminar, porque cuando estamos de datos en línea para realizar una excepción es lanzada, lo que resulta en la terminación de todo el lote de datos, que deseamos ver. API anotación de la programación se explica. Recomiendan sustituido por ScheduledThreadPoolExecutor, pero para usarlo, hay muchas consideraciones.
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor heredado de ThreadPoolExecutor, de manera que ScheduledThreadPoolExecutor o un grupo de subprocesos en la naturaleza. También tiene coorPoolSize y WorkQueue, como una subclase de Ejecutable aceptar la tarea.
Especial es que implementa su propio DelayedWorkQueue cola de trabajo, el papel de la cola de tareas es una cola de tareas se ordenan en un cierto orden. Por ejemplo, dispuestos en orden de cantidad de tiempo de ejecución de la siguiente orden ascendente, por lo que la tarea de llevar a cabo tan pronto como sea posible se produjo en el primer equipo, la tarea "menos ansiedad" en la fila trasera de la cola, por lo que es fácil de conseguir el hilo "debe" tareas a realizar . Además, después del final de ScheduledThreadPoolExecutor todavía realizar tareas, calcular el momento de la ejecución siguiente, de nuevo en la cola de trabajos, a la espera para la siguiente llamada.
ScheduledThreadPoolExecutor puede decir que la realización de la versión multi-hilo temporizador de los funcionarios de JDK han recomendado ScheduledThreadPoolExecutor temporizador alternativo. La siguiente es una forma alternativa.
ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();
//使用
pool.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//TODO
}
}, 0 ,5, TimeUnit.SECONDS);
Además, cuando usamos springboot, sino que también puede ser utilizado de esta manera.
@Schedule manera a las anotaciones de uso
Las clases principales: @EnableScheduling @Scheduled
@Scheduled(fixedDelay = 5000)
public void doSomething(){
//TODO
}
Uso SchedulingConfigurer Interface + implementación de hilos runable
核心 类: Ejecutor, ScheduledThreadPoolExecutor, SchedulingConfigurer, Ejecutable
public class Task extends CommonTask implements Runnable {
//1.业务代码
public void run() {}
}
//2.任务执行
public void configureTasks(final ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(executor);
platform.getTasks().forEach(final task -> taskRegistrar.addTriggerTask(task, triggerContext -> {
ConTrigger trigger = new CronTrigger(task.getCron());
Date nextExecDate = trigger.nextExecutionTime(triggerContext);
return nextExecDate;
}));
}
Api consigue utilizando marco de cuarzo
- marco de integración Springboot usando manera de cuarzo
核心 类: Trabajo, AdaptableJobFactory, SchedulerFactoryBean, Programador, TriggerKey.
Comparación de tres métodos de uso.
función | comentario @Scheduled | SchedulingConfigure Interface + hilo runable | cuarzo |
---|---|---|---|
Ejecutarse en paralelo | Necesidad de agregar perfiles | Necesitamos Notas de configure | por defecto concurrente |
nueva dinámica | , hay buenas soluciones complejas | , hay buenas soluciones complejas | Utilizar su propia API |
modificación dinámica | Uso $ {} la expresión cron | Utilice el modo combinado, para modificar el hilo | Utilizar su propia API |
La información puede ser monitoreado | , hay buenas soluciones complejas | API se puede utilizar para obtener información sencilla, imperfecta | Utilizar su propia API, pero relativamente pocos pueden obtener información |
la cobertura combinada de varias implementaciones y la demanda real, el uso de cuarzo + multi-roscado enfoque debe ser la solución más adecuada, pero en términos de supervisión de la información, todos los programas no puede satisfacer la demanda real, por lo tanto, la necesidad de introducir adicionales, registros y ¿Qué hay de nuevo en el final del negocio de la información de supervisión manual, con el fin de lograr un registro detallado fines de vigilancia.