Compartilhamento de tecnologia

SpringBoot diário: a implementação @Scheduled é executada uma vez quando o serviço é iniciado

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Falando em tarefas agendadas, devemos pensar em @Scheduled, Quartz e XXL-JOB. No entanto, alguns serviços únicos ou pequenos projetos podem usar @Scheduled diretamente para implementar tarefas assíncronas por conveniência e velocidade. Portanto, os requisitos temáticos deste artigo são ampliados.

Quando @Scheduled é usado em um projeto, como a tarefa assíncrona especificada pode ser executada antecipadamente quando o projeto é iniciado?

1. Explicação detalhada de @Scheduled

A anotação @Scheduled oferece suporte a vários parâmetros para controlar de maneira flexível o tempo de execução da tarefa.

  • cron: expressão Cron, que pode controlar com precisão segundos, minutos, horas, dias, meses, semanas, etc.
    Insira a descrição da imagem aqui
  • zone: Recebe um fuso horário, como Ásia/Xangai, o fuso horário que geralmente usamos. Geralmente deixamos este campo em branco.
  • fixaDelay: Quanto tempo após o término da última execução ele será executado novamente. Como @Scheduled(fixedDelay = 5000)
  • fixaDelayString: tem o mesmo significado que fixaDelay, mas na forma de uma string. A única diferença é que ele suporta espaços reservados, como @Scheduled(fixedDelayString = "5000")
  • fixaRate: quanto tempo após o último início do tempo de execução, como @Scheduled(fixedRate = 5000)
  • fixaRateString: tem o mesmo significado que fixaRate, mas na forma de uma string. A única diferença é que os marcadores de posição são suportados.
  • inicialDelay: Quanto tempo atrasar a execução pela primeira vez. Por exemplo, o primeiro atraso é de 1 segundo antes da execução. Depois disso, ele será executado a cada 5 segundos de acordo com a regra fixaRate. )
  • inicialDelayString: tem o mesmo significado que inicialDelayString, mas na forma de uma string. A única diferença é que os marcadores de posição são suportados.

2. Implementação lógica

1. Crie um método lógico de tarefa agendada

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class ScheduledTest {

    @Scheduled(cron = "* 1 * * * ?")
    public void task1() throws Exception{
        System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. Crie uma nova classe de execução de inicialização

Esta classe chama principalmente o método de tarefa especificado manualmente na inicialização

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class StartupTasks {

    private final ScheduledTest scheduledTasks;

    public StartupTasks(ScheduledTest scheduledTasks) {
        this.scheduledTasks = scheduledTasks;
    }

    @PostConstruct
    public void startUp() {
        try {
            System.out.println("服务启动执行任务");
            scheduledTasks.task1();
        }catch (Exception e){
			e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Nota: Lembre-se de adicionar @EnableScheduling à classe de inicialização para que a tarefa agendada seja executada. Obviamente, isso não afeta o teste lógico deste artigo.

3. Resultados do teste

Após o início do serviço, visualize as informações de impressão
Insira a descrição da imagem aqui