Compartilhamento de tecnologia

Escrevendo tarefas agendadas no springboot

2024-07-08

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

Parte 1: Introdução

1.1 A importância das tarefas agendadas

No desenvolvimento de software moderno, as tarefas agendadas são um componente chave da automação de aplicativos e da eficiência operacional. Quer se trate de backup de dados, verificação da integridade do sistema, geração regular de relatórios ou processos automatizados acionados por atividades do usuário, as tarefas agendadas desempenham um papel indispensável. Eles garantem a continuidade da lógica de negócios e as capacidades de automanutenção do sistema.

1.2 Aplicação de tarefas agendadas em diferentes campos
  • Sistema de planejamento de recursos empresariais (ERP): tarefas agendadas podem ser usadas para gerar relatórios financeiros, atualizações de inventário, etc.
  • Sistema de gerenciamento de conteúdo (CMS): publique conteúdo regularmente, limpe o cache, etc.
  • Sistema de gerenciamento de relacionamento com o cliente (CRM): Envie regularmente e-mails de marketing, lembretes de acompanhamento do cliente, etc.
  • Plataforma de publicidade on-line: Ajuste regularmente as estratégias de publicidade, otimize a exibição de publicidade, etc.
1.3 Desafios na implementação de tarefas agendadas tradicionais

No modelo de desenvolvimento tradicional, a implementação de tarefas agendadas geralmente requer a dependência das tarefas agendadas do sistema operacional (como o crontab do Linux) ou a escrita de lógica de negócios complexa. Esses métodos têm muitos inconvenientes:

  • Configuração complexa: requer um conhecimento profundo do agendador de tarefas do sistema operacional.
  • Difícil de manter: as tarefas estão espalhadas em diferentes sistemas e aplicativos, dificultando seu gerenciamento e monitoramento uniforme.
  • Má escalabilidade: à medida que sua empresa cresce, adicionar ou modificar tarefas torna-se complexo e demorado.
1.4 Solução Spring Boot

Como uma estrutura Java popular, o Spring Boot oferece uma maneira mais elegante e integrada de implementar tarefas agendadas. Ele simplifica a configuração e fornece APIs avançadas, permitindo que os desenvolvedores integrem rapidamente funções de tarefas agendadas aos aplicativos.

1.5 Suporte do Spring Boot para tarefas agendadas

Spring Boot aprovado@EnableSchedulinge@Scheduled As anotações tornam extremamente fácil escrever e configurar tarefas agendadas em aplicativos Spring. Além disso, o Spring Boot também oferece integração com o Spring Task Scheduler, que fornece suporte para requisitos de tarefas agendadas mais avançados.

1.6 Por que escolher Spring Boot para implementar tarefas agendadas
  • Simplifique a configuração: tarefas agendadas podem ser implementadas por meio de anotações e uma pequena quantidade de configuração.
  • Fácil de integrar: Perfeitamente integrado ao ecossistema Spring, você pode aproveitar outros recursos do Spring, como gerenciamento de transações, injeção de dependência, etc.
  • Forte apoio da comunidade: Spring Boot tem uma grande comunidade de desenvolvedores que fornece muitos recursos e práticas recomendadas.
  • Fácil de testar: as tarefas agendadas do Spring Boot facilitam a execução de testes de unidade e de integração.

Parte 2: Introdução ao Spring Boot

2.1 Visão geral do Spring Boot

Spring Boot é desenvolvido pela equipe Pivotal (agora parte da VMware) e é uma estrutura modular e rápida de desenvolvimento e implantação baseada na estrutura Spring. Seu objetivo é simplificar a configuração inicial e o processo de desenvolvimento de aplicativos Spring e reduzir o trabalho de configuração dos desenvolvedores, fornecendo uma série de configurações padrão.

2.2 Recursos principais do Spring Boot
  • configuração automática: Spring Boot pode configurar automaticamente aplicativos Spring com base nas dependências do projeto.
  • Operar de forma independente: os aplicativos Spring Boot incluem servidores HTTP integrados (como Tomcat, Jetty ou Undertow) e não precisam ser implantados em servidores externos.
  • Nenhuma configuração XML necessária: Spring Boot não requer o uso de arquivos de configuração XML, embora ainda ofereça suporte à configuração XML.
  • Suporte de microsserviço: Spring Boot é muito adequado para arquitetura de microsserviços e é fácil de construir, implantar e expandir.
2.3 Mecanismo de inicialização do Spring Boot

O aplicativo Spring Boot é iniciado atravésSpringApplication.run() Método implementado, ele criará e configurará automaticamente o contexto da aplicação Spring. Spring Boot também fornece uma interface de linha de comando (CLI) e um endpoint do atuador para monitorar e gerenciar aplicativos.

2.4 Gerenciamento de dependências do Spring Boot

Spring Boot aprovadospring-boot-starter-parent Fornece gerenciamento de dependências e simplifica a configuração de projetos Maven e Gradle. Ele predefine números de versão e intervalos de dependência, facilitando o gerenciamento de conflitos de dependência e controle de versão.

2.5 Comunidade do Spring Boot e ecologia de plug-ins

Spring Boot possui uma comunidade ativa de código aberto que fornece um grande número de plug-ins e "Starters" que contêm as dependências necessárias para construir funcionalidades específicas, comospring-boot-starter-webPara construir aplicativos RESTful.

2.6 Exemplo: Crie um aplicativo Spring Boot simples

Abaixo estão as etapas para criar um aplicativo Spring Boot simples e o código de exemplo correspondente:

  1. Criar estrutura do projeto: Use Spring Initializr (https://start.spring.io/) para gerar rapidamente a estrutura do projeto.
  2. Adicionar dependências: Selecione os Starters necessários, por exemplospring-boot-starter-web
  3. Escreva a classe principal do aplicativo
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class MyApp {
        public static void main(String[] args) {
            SpringApplication.run(MyApp.class, args);
        }
    }
    
  4. Crie um controlador REST
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MyController {
        @GetMapping("/")
        public String home() {
            return "Hello, Spring Boot!";
        }
    }
    
2.7 Método de implantação Spring Boot
  • Empacotado como JAR: O aplicativo Spring Boot pode ser empacotado em um arquivo JAR executável por meiojava -jarO comando é executado.
  • Implantação em contêiner: os aplicativos Spring Boot são adequados para tecnologias de conteinerização, como Docker, e são fáceis de implantar em ambientes de nuvem.
2.8 A relação entre Spring Boot e Spring Framework

Spring Boot não é um substituto do Spring Framework, mas um método de desenvolvimento rápido baseado no Spring Framework. Ele fornece uma maneira rápida de iniciar aplicativos Spring, mantendo todos os recursos e flexibilidade do Spring Framework.

2.9 Por que escolher o Spring Boot?
  • desenvolvimento rápido: A configuração automática e simplificada do Spring Boot tornam o desenvolvimento mais rápido.
  • Fácil de implantar: O servidor HTTP incorporado e o suporte à conteinerização simplificam a implantação.
  • suporte da comunidade: a comunidade Spring Boot oferece diversos recursos, plug-ins e práticas recomendadas.
2.10 Conclusão

Spring Boot é uma estrutura projetada para desenvolvimento Java moderno. Ele simplifica a configuração e fornece uma série de funções prontas para uso, permitindo que os desenvolvedores se concentrem na implementação da lógica de negócios em vez da construção de infraestrutura. Nos capítulos seguintes, nos aprofundaremos na aplicação do Spring Boot em tarefas agendadas e mostraremos como usar seus recursos para construir tarefas automatizadas eficientes e confiáveis.

Parte 3: Conceitos básicos de tarefas agendadas

3.1 Definição de tarefas agendadas

Uma tarefa agendada é um trecho de código ou programa executado automaticamente em um horário predeterminado. Eles podem ser únicos ou periódicos e são usados ​​para realizar tarefas automatizadas, como backup de dados, envio de notificações, realização de verificações agendadas, etc.

3.2 Tipos de tarefas agendadas
  • tarefas únicas: executado apenas uma vez, geralmente para operações específicas de inicialização ou limpeza.
  • tarefas periódicas: executado repetidamente em um determinado intervalo de tempo, que pode ser um intervalo fixo ou um horário baseado em calendário.
3.3 Cenários de aplicação de tarefas agendadas
  • backup de dados: Faça backup do banco de dados regularmente para garantir a segurança dos dados.
  • Geração de relatório: Gere relatórios de negócios regularmente para ajudar na tomada de decisões.
  • Monitoramento do sistema: verifique periodicamente o status do sistema para descobrir e resolver problemas em tempo hábil.
  • Notificação do usuário: envie lembretes ou notificações com base no comportamento do usuário ou em eventos específicos.
3.4 A importância das tarefas agendadas

As tarefas agendadas são essenciais para manter o sistema em funcionamento e automatizar os processos de negócios. Eles podem reduzir a intervenção manual, aumentar a eficiência e garantir a pontualidade e a precisão das tarefas.

3.5 Desafios na implementação de tarefas agendadas
  • precisão do tempo: Garanta que as tarefas sejam executadas com precisão no horário programado.
  • Manipulação de erros: trata adequadamente os erros que podem ocorrer durante a execução.
  • Gestão de recursos: aloque recursos de maneira razoável para evitar impacto no desempenho do sistema durante a execução da tarefa.
3.6 Como implementar tarefas agendadas
  • nível do sistema operacional: Use o crontab ou o Agendador de Tarefas do Windows.
  • nível de linguagem de programação: Use uma biblioteca ou estrutura específica da linguagem, como Javajava.util.Timer
  • Nível da estrutura do aplicativo: Use o suporte a tarefas agendadas fornecido pela estrutura, como Spring@Scheduled
3.7 Exemplo: Usando Javajava.util.TimerImplementar tarefas agendadas

Aqui está um exemplo usando a biblioteca padrão JavaTimerExemplo de tarefa agendada simples implementada por classe:

import java.util.Timer;
import java.util.TimerTask;

public class SimpleTimerTask {
    public static void main(String[] args) {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("执行定时任务:"   System.currentTimeMillis());
            }
        };
        Timer timer = new Timer();
        long delay = 0;
        long intervalPeriod = 1000; // 间隔1秒执行一次
        timer.scheduleAtFixedRate(task, delay, intervalPeriod);
    }
}
3.8 Exemplo: Usando expressões cron

As expressões cron são uma forma poderosa de configurar o tempo de execução de tarefas agendadas. A seguir está um exemplo de uma expressão cron para executar uma tarefa todos os dias à 1h:

0 0 1 * * ?
3.9 Tarefas agendadas no Spring Boot

Spring Boot aprovado@Scheduled As anotações simplificam a configuração e implementação de tarefas agendadas.Aqui está um uso@ScheduledExemplo anotado de tarefa agendada do Spring Boot:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {
    
    @Scheduled(fixedRate = 5000) // 每5秒执行一次
    public void reportCurrentTime() {
        System.out.println("当前时间:"   System.currentTimeMillis());
    }
    
    @Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行
    public void scheduleTask() {
        System.out.println("执行定时任务:"   System.currentTimeMillis());
    }
}
3.10 Monitoramento e gerenciamento de tarefas agendadas
  • exploração madeireira: registre a execução de tarefas para facilitar o rastreamento de problemas e o monitoramento de desempenho.
  • Exame de saúde: verifique regularmente o status de integridade das tarefas agendadas para garantir que estejam funcionando normalmente.

Parte 4: Implementação de tarefas de tempo no Spring Boot

4.1 Uso@Scheduledanotação

@Scheduled É uma anotação fornecida pelo Spring para simplificar a implementação de tarefas agendadas. Ele permite criar métodos executados periodicamente por meio de configuração simples de anotações.

4.2 @ScheduledConfiguração de anotação
  • fixedRate: especifique o intervalo de tempo fixo (em milissegundos) entre duas execuções de tarefas.
  • fixedDelay: especifique um intervalo de tempo fixo entre o final da execução da última tarefa e o início da próxima tarefa.
  • initialDelay: Especifique o tempo de atraso antes que a tarefa seja executada pela primeira vez.
  • cron: use expressões cron para especificar o agendamento para execução da tarefa.
4.3 Exemplo: UsofixedRate

O exemplo a seguir mostra um método que é executado a cada 5 segundos:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class FixedRateTask {

    @Scheduled(fixedRate = 5000)
    public void taskWithFixedRate() {
        System.out.println("任务执行:"   LocalDateTime.now());
    }
}
4.4 Exemplo: UsofixedDelay

O exemplo a seguir mostra um método que é executado 1 segundo após o término da execução da tarefa anterior:

@Scheduled(fixedDelay = 1000)
public void taskWithFixedDelay() {
    System.out.println("任务执行:"   LocalDateTime.now());
}
4.5 Exemplo: UsandoinitialDelay

O exemplo a seguir mostra um método que é executado primeiro 10 segundos após o início do aplicativo e depois a cada 5 segundos:

@Scheduled(initialDelay = 10000, fixedRate = 5000)
public void taskWithInitialDelay() {
    System.out.println("任务执行:"   LocalDateTime.now());
}
4.6 Usando expressões cron

As expressões Cron fornecem configurações de tempo mais complexas, permitindo especificar tempos de execução específicos. O exemplo a seguir mostra um método que é executado todos os dias à 1h:

@Scheduled(cron = "0 0 1 * * ?")
public void taskWithCronExpression() {
    System.out.println("任务执行:"   LocalDateTime.now());
}
4.7 Tratamento de exceções de execução de tarefas

Tarefas agendadas podem gerar exceções, o Spring fornece@Asyncanotação para executar tarefas de forma assíncrona e usar@ExceptionHandlerpara lidar com exceções.

@Async
@Scheduled(cron = "0 0/30 * * * ?")
public void taskWithExceptionHandling() {
    if (Math.random()