tiempo Task Timer java causada por problemas de producción

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

  1. marco de integración Springboot usando manera de cuarzo

核心 类: Trabajo, AdaptableJobFactory, SchedulerFactoryBean, Programador, TriggerKey.

Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
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.

Publicado 12 artículos originales · ganado elogios 2 · Vistas 666

Supongo que te gusta

Origin blog.csdn.net/gonghaiyu/article/details/104312999
Recomendado
Clasificación