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
- estrutura de integração Springboot usando forma de quartzo
核心 类: Job, AdaptableJobFactory, SchedulerFactoryBean, Scheduler, TriggerKey.
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.