A anotação @Scheduled na primavera

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.

Read more

Um guia para o Agendador de tarefas Spring

Um guia rápido e prático para agendar no Spring com o Task Scheduler

Read more

Programação na primavera com quartzo

Introdução rápida ao trabalho com quartzo na primavera.

Read more

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.