A anotação @Scheduled na primavera
1. Visão geral
Neste artigo, discutiremosthe Spring @Scheduled annotation - ilustraremos como ele pode ser usado para configurar e agendar tarefas.
As regras simples que precisam ser seguidas para anotar um método com@Scheduled são:
-
um método deve ter um tipo de retorno nulo
-
um método não deve aceitar nenhum parâmetro
Leitura adicional:
Como fazer @Async na primavera
Como habilitar e usar o @Async no Spring - da configuração muito simples e uso básico aos executores mais complexos e estratégias de tratamento de exceções.
Um guia para o Agendador de tarefas Spring
Um guia rápido e prático para agendar no Spring com o Task Scheduler
Programação na primavera com quartzo
Introdução rápida ao trabalho com quartzo na primavera.
2. Ativar suporte para agendamento
Para habilitar o suporte para agendamento de tarefas e a anotação@Scheduled no Spring, podemos usar a anotação no estilo Java:
@Configuration
@EnableScheduling
public class SpringConfig {
...
}
Ou podemos fazer o mesmo em XML:
3. Agende uma tarefa com atraso fixo
Vamos começar configurando uma tarefa para ser executada após um atraso fixo:
@Scheduled(fixedDelay = 1000)
public void scheduleFixedDelayTask() {
System.out.println(
"Fixed delay task - " + System.currentTimeMillis() / 1000);
}
Nesse caso, a duração entre o final da última execução e o início da próxima execução é fixa. A tarefa sempre espera até que a anterior seja concluída.
Essa opção deve ser usada quando for obrigatório que a execução anterior seja concluída antes de executar novamente.
4. Agende uma tarefa em uma taxa fixa
Vamos agora executar uma tarefa em um intervalo fixo de tempo:
@Scheduled(fixedRate = 1000)
public void scheduleFixedRateTask() {
System.out.println(
"Fixed rate task - " + System.currentTimeMillis() / 1000);
}
Esta opção deve ser usada quando cada execução da tarefa é independente.
Observe que as tarefas agendadas não são executadas em paralelo por padrão. Portanto, mesmo se usarmosfixedRate, a próxima tarefa não será chamada até que a anterior seja concluída.
Se quisermos oferecer suporte ao comportamento paralelo em tarefas agendadas, precisamos adicionar a anotação@Async:
@EnableAsync
public class ScheduledFixedRateExample {
@Async
@Scheduled(fixedRate = 1000)
public void scheduleFixedRateTaskAsync() throws InterruptedException {
System.out.println(
"Fixed rate task async - " + System.currentTimeMillis() / 1000);
Thread.sleep(2000);
}
}
Agora, esta tarefa assíncrona será chamada a cada segundo, mesmo se a tarefa anterior não for concluída.
5. Taxa Fixa vs Atraso Fixo
Podemos executar uma tarefa agendada usando a anotação@Scheduled do Spring, mas com base nas propriedadesfixedDelayefixedRate a natureza das mudanças de execução.
A propriedadefixedDelay garante que haja um atraso den milissegundos entre a hora de término da execução de uma tarefa e a hora de início da próxima execução da tarefa.
Essa propriedade é especificamente útil quando precisamos garantir que apenas uma instância da tarefa seja executada o tempo todo. Para trabalhos dependentes, é bastante útil.
The fixedRate property runs the scheduled task at every n millisecond. Não verifica nenhuma execução anterior da tarefa.
Isso é útil quando todas as execuções da tarefa são independentes. Se não esperamos exceder o tamanho da memória e do pool de threads,fixedRate deve ser bastante útil.
Mas, se as tarefas recebidas não terminarem rapidamente, é possível que terminem com "exceção de falta de memória".
6. Agende uma tarefa com atraso inicial
A seguir - vamos agendar uma tarefa com um atraso (em milissegundos):
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void scheduleFixedRateWithInitialDelayTask() {
long now = System.currentTimeMillis() / 1000;
System.out.println(
"Fixed rate task with one second initial delay - " + now);
}
Observe como estamos usandofixedDelay einitialDelay neste exemplo. A tarefa será executada uma primeira vez após o valorinitialDelay - e continuará a ser executada de acordo comfixedDelay.
Esta opção é útil quando a tarefa tem uma configuração que precisa ser concluída.
7. Agende uma tarefa usando expressões Cron
Às vezes, atrasos e taxas não são suficientes, e precisamos da flexibilidade de uma expressão cron para controlar o agendamento de nossas tarefas:
@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {
long now = System.currentTimeMillis() / 1000;
System.out.println(
"schedule tasks using cron jobs - " + now);
}
Observação - neste exemplo, estamos agendando uma tarefa para ser executada às 10:15 no dia 15 de cada mês.
8. Parametrizando o Cronograma
A codificação desses agendamentos é simples, mas geralmente você precisa controlar o agendamento sem recompilar e reimplementar o aplicativo inteiro.
Faremos uso de Expressões Spring para externalizar a configuração das tarefas - e vamos armazená-las em arquivos de propriedades:
Tarefa AfixedDelay:
@Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")
Tarefa AfixedRate:
@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")
Uma tarefa baseada em expressãocron:
@Scheduled(cron = "${cron.expression}")
9. Configurando Tarefas Agendadas Usando XML
O Spring também fornece uma maneira XML de configurar as tarefas agendadas - eis a configuração XML para configurá-las:
10. Conclusão
Neste artigo, entendemos o caminho paraconfigure and use the @Scheduled annotation.
Abordamos o processo para permitir o agendamento e várias maneiras de configurar os padrões de tarefas de agendamento.
Os exemplos mostrados podem ser encontradosover on GitHub.