Java Task temporizador causada por problemas de produção

Java Task temporizador causada por problemas de produção

O outro problema é que a equipe de produção lá, mas porque eu tenho que participar de revisões de código deste módulo foi também apontou para o lugar em questão, as alterações propostas para ScheduledExecutorService ou testes. Mas o grau de atenção para trás o suficiente pay, levando a problemas de produção levantadas.

análise de código problema

Em que a parte seguinte do código.

Timer timer = new Timer();
timer.schedule(new TimerTask() {
        @Override
        public void run() {
            try {
                //TODO
            } catch (InterruptedException e) {
                e.printStackTrace(); 
            }
        }
    }, 10*1000, 5000); 

Desta forma single-threaded, há um problema será quando houver várias tarefas programadas: A tarefa se o tempo de execução é muito longa, levará a tarefa B está atrasado hora de início!

Outro problema, o problema deve ser parte do projeto: se o segmento tarefa ao executar uma fila de tarefas, a tarefa lança uma exceção, fará com que o segmento para finalizar causa de fora do corpo do ciclo, ou seja, temporizador parou de funcionar!

Então, este lugar uma vez lançada, em seguida, fazer com que o segmento para finalizar, porque quando nós somos dados on-line para realizar uma exceção é lançada, resultando na rescisão de todo o lote de dados, o que queremos ver. anotação API do cronograma é explicado. Recomendamos substituído por ScheduledThreadPoolExecutor, mas para usá-lo, há muitas considerações.

ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor herdada de ThreadPoolExecutor, de modo que ScheduledThreadPoolExecutor ou um pool de threads na natureza. Ele também tem coorPoolSize e WorkQueue, como uma subclasse de Runnable aceitar a tarefa.

Especial é que ele implementa sua própria DelayedWorkQueue fila de trabalho, o papel da fila de tarefas é uma fila de tarefas são classificadas em uma determinada ordem. Por exemplo, dispostos em ordem de tempo de execução a partir da próxima ascendente, de modo que a tarefa a ser realizada o mais rápido possível veio na primeira equipa, a tarefa "menos ansiosa" na linha de trás da fila, tornando mais fácil para obter o thread "deve" tarefas a serem executadas . Além disso, após o fim da ScheduledThreadPoolExecutor ainda executar tarefas, calcular o tempo de execução seguinte, de volta à fila de trabalhos, esperando a próxima chamada.

ScheduledThreadPoolExecutor pode-se dizer que a realização da versão multi-threaded Temporizador dos funcionários JDK têm recomendado ScheduledThreadPoolExecutor Temporizador alternativa. O que se segue é uma forma alternativa.

ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();  
//使用
pool.scheduleAtFixedRate(new TimerTask() {  
        @Override  
        public void run() {  
            //TODO
        }  
    }, 0 ,5, TimeUnit.SECONDS);    

Além disso, quando usamos springboot, ele também pode ser usado dessa forma.

maneira @Schedule para anotações de uso

classes principais: @EnableScheduling @Scheduled

 @Scheduled(fixedDelay = 5000)
 public void doSomething(){
     //TODO
 }

Use SchedulingConfigurer interface + implementação de threads runable

核心 类: Executor, ScheduledThreadPoolExecutor, SchedulingConfigurer, Runnable

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 conseguido usando quadro de quartzo

  1. estrutura de integração Springboot usando forma de quartzo

核心 类: Job, AdaptableJobFactory, SchedulerFactoryBean, Scheduler, TriggerKey.

Aqui Insert Picture Descrição
Aqui Insert Picture Descrição
Comparação de três métodos de utilização.

função comentário @Scheduled SchedulingConfigure interface + fio runable quartzo
Executar em paralelo Necessidade de adicionar perfis Precisamos Notas do configure default Concurrent
nova dinâmica Complexas, sem boas soluções Complexas, sem boas soluções Use a sua própria API
modificação dinâmica Use $ {} expressão cron Utilizar o modo combinado, para modificar o segmento Use a sua própria API
As informações podem ser monitorados Complexas, sem boas soluções API pode ser usada para obter informações simples e imperfeito Use a sua própria API, mas relativamente poucos podem obter informações

cobertura combinada de várias implementações e demanda real, o uso de quartzo + multi-thread abordagem deve ser a solução mais adequada, mas em termos de monitoramento de informações, todos os programas não pode atender a demanda real, portanto, a necessidade de introduzir adicionais, logs, e o que há de novo no fim do negócio das informações de vigilância Manual, a fim de alcançar um registro detalhado efeitos de controlo.

Publicado 12 artigos originais · ganhou elogios 2 · Visualizações 666

Acho que você gosta

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