• Home

    Escolha seu Plano

    Carreiras Alura

    Evolua com profundidade técnica, direção clara e aplicação prática.

    Jornadas guiadas do básico ao avançado com checkpoints práticos, desenhadas para quem busca profundidade e protagonismo técnico.

    Iniciante

    Comece do zero com uma trilha clara e progressiva.

    Fundamentos práticos para dar os primeiros passos com segurança e construir uma base sólida.

    Intermediário

    Continue sua evolução com cursos que conectam fundamentos, ferramentas e prática profissional. Ganhe autonomia, e avance para projetos mais completos.

    Avançado

    Aprofunde temas técnicos e estratégicos para enfrentar desafios mais complexos. Explore boas práticas, arquitetura, performance com visão profissional.

    Cursos

    Ver mais cursos de Back-end
    • Pensamento computacional: fundamentos da computação e lógica de programação
    • Lógica de programação: mergulhe em programação com JavaScript
    • DDD: fundamentos do design orientado a domínio
    • ASP.NET: autenticação e autorização em APIs e aplicações web
    • Microsserviços: migração de monólitos e modularização

    Cursos

    Ver mais cursos de Dados
    • Python para Dados: primeiros passos
    • Excel: domine o editor de planilhas
    • Engenharia de Dados: Orquestração de Pipelines com Apache Airflow
    • Power BI Desktop: construindo meu primeiro dashboard
    • Governança e Arquitetura de Dados

    Cursos

    Ver mais cursos de Inteligência Artificial
    • IA: Explorando o Potencial da Inteligência Artificial Generativa
    • Engenharia de Prompt: Criando Prompts Eficazes para IA Generativa
    • Claude para Análise de Dados: prompts, integrações e automações
    • Agno: criando agentes e sistemas multiagente
    • Engenharia de software na era da IA: segurança de aplicações com agentes, MCPs e código gerado por IA

    Cursos

    Ver mais cursos de Front-end
    • HTML e CSS: ambiente, estrutura e estilo
    • React: realizando testes avançados com Jest e Testing Library
    • React: integrando TypeScript em projetos
    • JavaScript: aprendendo a programar
    • React: aplicando arquiteturas de Micro frontends

    Cursos

    Ver mais cursos de DevOps
    • Sistema Operacional Linux: fundamentos e administração prática
    • Containers e Docker: empacotamento, isolamento e gestão
    • Redes: dos conceitos iniciais à criação de uma intranet
    • Linux: gerenciando diretórios, arquivos, permissões e processos
    • Cibersegurança: Fundamentos e práticas integradas

    Cursos

    Ver mais cursos de UX & Design
    • UX Research: mapeando a experiência da pessoa usuária
    • UX/UI Design: Entregando produtos digitais com IA
    • UI Design: Prototipação e animações interativas
    • Figma: Conhecendo o programa
    • Product Design: métricas e ciclo de vida do produto

    Cursos

    Ver mais cursos de Gestão & Negócios
    • Canva: Criação de landing pages e e-mail marketing
    • Agilidade: como ela pode ajudar a criar um time de alta performance
    • Google Analytics 4: Extrair insights e configurar eventos
    • Management 3.0: gerencie o ambiente, não as pessoas
    • Automação de processos com n8n: Inteligência de dados para Marketing

    Cursos

    Ver mais cursos de Mobile
    • React Native: Estilização e Layouts com Flexbox e StyleSheet
    • Flutter: Graphql e suporte offline
    • Android com Gemini: Trabalhando com textos e imagens na IA
    • Dart: trabalhando com orientação a objetos
    • React Native: Dominando Listas com FlatList e ScrollView

    Carreiras

    Ver mais carreiras
    • Especialista em IA
    • Engenharia de IA
    • Ai native software engineering
    • Arquitetura de Soluções com IA
    • AI Product Design
    • Engenharia de Machine Learning
    • Desenvolvimento Front-End React
    • Engenharia de Dados
    • Cloud Security
    • Social Media Marketing
    • Engenharia de Agentes de IA

    Cursos

    • Engenharia de Prompt: Prompts Eficazes para IA Generativa
    • Claude Code: Criando sua Primeira Aplicação
    • Python: Crie sua Primeira Aplicação
    • Git e GitHub: Compartilhando e Colaborando
    • N8N: Fluxos de Trabalho Avançados

    Cursos

    • Copilot Studio: Solução Multiagentes
    • Padrões de API HTTP e Modelagem de APIs
    • Python para Análise de Dados com SQL
    • Docker: Criando e Gerenciando Containers
    • Design com IA: Otimizando o Processo Criativo

    Cursos

    • Model Context Protocol (MCP)
    • Spec-Driven Development: Dev Assistido por Agentes
    • Arquitetura de Sistemas Distribuídos com Java
    • Governança de Modelos e Reprodutibilidade
    • Pentest: Vulnerabilidades em Aplicações Web

    Escolha seu Plano

    Skills & Go

    O Skills & Go é para Tech Leads, Product Managers, estrategistas e early adopters que transformam ideias em soluções de alto impacto. Em cursos ao vivo e 100% online, você domina a nova era da IA em tempo real.

    Aulas ao vivo

    Saiba mais
    • Agentic Engineering: orquestre múltiplos agentes com confiabilidade
    • Building AI Products: transforme ideias em produtos reais com IA
    • AI Data Strategy: transforme dados em decisões estratégicas com IA

    Escolha seu Plano

    Eventos Alura

    Nossos eventos são pensados para quem quer estar à frente das mudanças em tecnologia, IA e inovação. Em experiências presenciais, você acompanha tendências e se conecta com especialistas que estão moldando o futuro.

    Próximos eventos

    • Imersão Engenharia de Software: Dev na Era da IA
    • IA Conference
    • Alura Signals
  • Talent Lab
  • IA

    Escolha seu Plano

    Conteúdos gratuitos

    Explore conteúdos gratuitos para aprender tecnologia no seu ritmo. Encontre artigos com conteúdos técnicos para aprender na prática, notícias para acompanhar as principais tendências do mercado e o Alura Labs, com análises e reflexões de especialistas sobre tecnologia, IA e carreira.

    Conteúdos gratuitos

    • Artigos
    • Notícias
    • Alura Labs
  • Para Empresas
Ver planos
Links principais
  • Planos e Promoções
  • Links complementares do menu mobile
  • Talent lab
  • Inteligência Artificial
  • Pós Graduações
  • Para Empresas
  • Sobre a Alura
  • Grupo Alun
  • Entrar
    • Home
    • Carreiras
    • Skills & Go
    • Talent Lab
    • Inteligência Artificial
    • Pós Graduações
    • Artigos
    • Sobre a Alura
    • Grupo Alun
    LoginContato
    • LinkedIn
    • Instagram
    • YouTube
    1. Página inicial
    2. Back-end
    3. Agendando tarefas com Scheduled do Spring

    Agendando tarefas com Scheduled do Spring

    9 min9 minutos de leitura

    Alura

    9 min9 minutos de leitura

    Publicado: 08/01/2017

    Última atualização: 20/03/2026

    1. Utilizando a API Timer do Java
    2. Utilizando a annotation @Scheduled
    3. Configurando o agendamento no Spring
    4. Agendamento por um determinado horário do dia
    5. Agendamento com o Cron
    6. Usando o Cron no Scheduled
    7. Cuidados ao usar o Cron

    Estou desenvolvendo um sistema de vendas web utilizando Spring Boot e agora o cliente pediu algumas funcionalidades um pouco peculiares...

    Ele deseja saber como está o fluxo de vendas por um determinado período, por exemplo, a cada hora, ou então, a cada dia... Como será que podemos fazer essa rotina que irá realizar essas tarefas agendadas?

    Utilizando a API Timer do Java

    Inicialmente, em uma implementação utilizando as APIs disponíveis em Java, poderíamos fazer uso da classe Timer:

    
    Timer timer = new Timer();
    

    Em seguida, faríamos uso do método scheduleAtFixedRate() que espera uma implementação da classe abstrata TimerTask como primeiro parâmetro e mais dois parâmetros do tipo long que indicam o início da execução e tempo constante para reexecutar sucessivamente em milisegundos:

    
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override public void run() { 
        System.out.println("Executando a primeira vez em " +
         "1 segundo e as demais a cada 5 segundos!"); }
        }, 1000, 5000);
    

    Em outras palavras, neste exemplo estaríamos executando o código, inicialmente, depois de um segundo, e então, todas as vezes após 5 segundos!

    Considerando esse exemplo, para que conseguíssemos realizar aquela consulta para o cliente que verifica o fluxo de vendas de um determinado período, como por exemplo, uma hora, faríamos algo como:

    
    public class VerificadorDePegamentos {
        private final long SEGUNDO = 1000;
        private final long MINUTO = SEGUNDO * 60; 
        private final long HORA = MINUTO * 60;
        public void verificaPorHora() { 
            Timer timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask() {
                @Override public void run() { // Código que realiza a consulta de fluxo de vendas }
                }, 0, HORA); 
            }
        }
    

    Em outras palavras, poderíamos criar uma classe responsável em ficar verificando as vendas realizadas a cada uma hora e nos devolveria a resposta que o nosso cliente tanto espera!

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Utilizando a annotation @Scheduled

    Porém, veja a quantidade de código que tivemos que escrever para que fosse possível realizar essa tarefa! Neste caso, já que estamos utilizando o Spring, será que não tem uma forma mais fácil?

    Felizmente, temos a annotation @Scheduled que já faz todo o papel do Timer e TimerTask pra nós! Em outras palavras, faríamos a mesma coisa que fizemos anteriormente da seguinte maneira:

    public class VerificadorDePegamentos {
        private final long SEGUNDO = 1000; 
        private final long MINUTO = SEGUNDO * 60; 
        private final long HORA = MINUTO * 60;
        @Scheduled(fixedDelay = HORA) 
        public void verificaPorHora() { 
            // Código que realiza a consulta de fluxo de vendas 
        }
    }
    

    Veja que o código diminuiu e muito! Porém, o que está acontecendo agora? No momento em usamos a annotation @Scheduled indicamos ao Spring que aquele método será agendado.

    Além disso, veja que está sendo enviado o parâmetro fixedDelay, esse parâmetro é equivalente ao último parâmetro do método scheduleAtFixedRate() da classe Timer, ou seja, é o tempo fixo que sempre vai ficar rodando!

    Também podemos usar outros parâmetros caso for necessário, segue alguns exemplos:

    • initialDelay: Configura a espera inicial do agendamento, basicamente ele é equivalente ao primeiro parâmetro do método scheduleAtFixedRate(). Ele também recebe valores long indicando os milisegundos.

    • fixedRate: Configura um período fixo entre o início e fim da execução do agendamento.

    Observe que estamos fazendo a mesma coisa que fazíamos antes, porém com um código muito mais simples de ser compreendido!

    Configurando o agendamento no Spring

    Conhecemos o Spring como um framework que facilita e muito a vida da pessoa desenvolvedora, isto é, com pouca configuração ele é capaz de gerenciar o ciclo de vida dos objetos entre diversas outras coisas...

    Porém, para que isso seja possível, pelo menos uma vez, precisamos indicar ao Spring que ele tenha esse tipo de comportamento! Portanto, para rodarmos o agendamento das tarefas com o Spring, será necessário realizar algumas configurações também.

    Transformando a classe em Component

    A primeira delas é fazer com que a classe que esteja utilizando a @Scheduled seja gerenciada pelo Spring. A forma mais fácil de fazer isso é basicamente tornando-a um Component por meio da annotation @Component:

    
    @Component public class VerificadorDePegamentos {
        //Atributos
        @Scheduled(fixedDelay = HORA) 
        public void verificaPorHora() { 
            // Código que realiza a consulta de fluxo de vendas 
        }
    }
    

    Habilitando o agendamento

    Agora que a classe está sendo gerenciada, precisamos apenas informar ao Spring que queremos habilitar o agendamento para ela por meio da annotation @EnableScheduling:

    
    @Component @EnableScheduling 
    public class VerificadorDePegamentos {
    e//Atributos
        @Scheduled(fixedDelay = HORA) 
        public void verificaPorHora() { 
            // Código que realiza a consulta de fluxo de vendas 
        }
    }
    

    Pronto, a nossa classe já está configurada! Agora basta apenas reiniciar o seu projeto do Spring Boot que o agendamento rodará!

    Lembrando que para realizar um teste mais perceptível utilize a base dos segundos no parâmetro fixedDelay ou fixedRate. ;)

    Agendamento por um determinado horário do dia

    Veja que agora conseguimos solucionar a situação em que o cliente queria ver a quantidade de vendas a cada 1 hora, ou seja, fizemos um agendamento a cada X tempo. Entretanto, se o cliente chegar e falar o seguinte:

    "Quero também um relatório que me mostre quantas vendas foram realizadas até a meio dia de todos os dias!"

    E agora? Como poderíamos fazer? Bom, uma solução inicial seria fazer com que a nossa task iniciasse às 12:00h, e então, ela tivesse um tempo fixo de 24:00h, certo? Dessa forma, todas as vezes que passe às 24:00h seria a meio dia de cada dia...

    Entretanto, veja que esse tipo de solução não é adequada, afinal, teremos algumas complicações dependendo de alguns cenários, por exemplo:

    • Aplicação (servidor) reiniciando: O período de 24:00h não seria mais válido.
    • Mudança de horário: Dependendo do cambio do horário teríamos 1 hora a mais ou a menos, ou seja, mais um preocupação.

    E agora? Será que tem alguma forma de contornar essa situação?

    Agendamento com o Cron

    Considerando todos esses cenários, o ideal seria fazer uso de algum tipo de recurso que permitisse de fato configurar de uma forma mais específica, os minutos, horas ou até mesmo o dia que o determinado agendamento será executado.

    Um dos mecanismos utilizados em sistemas baseados no Unix (como é o caso do Linux), para o agendamento de tarefas de uma forma mais pontual, é o Cron.

    Basicamente o Cron é um programa que permite realizarmos a execução de jobs em um determinado período, como por exemplo: a cada A segundos, B minutos, C horas no dia D execute uma tarefa!

    Todas as definições são feitas por meio de um recurso chamado Cron Expression.

    Exemplos do uso do Cron

    Abaixo seguem alguns exemplos de execução do Cron utilizando Cron Expression:

    • A cada segundo: ```

      "1"

    • Todos os dias que o horário tiver ao menos 01 segundos: ```

      "1"
    • A cada hora, baseada no relógio, que esteja com 00 minutos e segundos todos os dias: ```

      "0 0"
      Exemplos: 00:00:00, 01:00:00...

    Significado de cada campo do Cron

    A princípio o Cron pode parecer algo muito bizarro, porém, cada campo possui um significado bem especificado. Abaixo é listado o que cada campo significa junto com seus valores esperados:

     A B C D E F
    
    • A: Segundos (0 - 59).
    • B: Minutos (0 - 59).
    • C: Horas (0 - 23).
    • D: Dia (1 - 31).
    • E: Mês (1 - 12).
    • F: Dia da semana (0 - 6).

    Note também que nos exemplos foram usados o *, esse caracter indica que para o campo específicado qualquer valor será considerado.

    Observação: Quando fazemos uso do "/" concatenando algum valor, indicamos o seguinte: para cada (/) X (valor numérico) repetição acione, em outras palavras, */1 indica que se qualquer valor do campo segundo mudar será acionado, logo, se fosse */2, a cada 2 vezes que o campo segundo mudar de valor, será acionado.

    Usando o Cron no Scheduled

    Tendo conhecimento de todo o poder do Cron nessa pequena demonstração, seria superbacana usar um recurso similar ao Cron no @Scheduled...

    Felizmente podemos também fazer uso dele por meio do parâmetro cron, ou seja, para executar aquele agendamento que pegaria as vendas todos os dias ao meio dia poderia ser feito da seguinte maneira:

    
    @Component @EnableScheduling 
    public class VerificadorDePegamentos {
        private final long SEGUNDO = 1000; 
        private final long MINUTO = SEGUNDO * 60; 
        private final long HORA = MINUTO * 60;
        @Scheduled(cron = "0 0 12") 
        public void verificaPorHora() { 
            System.out.println(LocalDateTime.now()); 
            // Código que realiza a consulta de fluxo de vendas 
        }
    }
    

    Nessa Cron Expression temos uma execução de todos os dias ao meio dia!

    Cuidados ao usar o Cron

    Embora o Cron resolva o nosso problema de executar uma tarefa em um período bem específico, existe uma situação que pode ser problemática, que é justamente a Time Zone. Em outras palavras, se o local no qual o seu software estiver hospedado tiver um Time Zone diferente do seu, o horário de meio dia pode ser que não seja igual ao seu!

    Dessa forma, o Cron causaria mais problemas do que resolveria... E agora?

    Como sempre a gente vê, há sempre aquela flexibilidade em configurações quando usamos o Spring, e com o agendamento de tarefas não seria diferente! Ou seja, podemos também definir sob qual Time Zone a @Scheduled será executada por meio do parâmetro zone! Então ficaria da seguinte maneira:

    
    @Component @EnableScheduling 
    public class VerificadorDePegamentos {
        private static final String TIME_ZONE = "America/Sao_Paulo";
         // atributos
        @Scheduled(cron = "0 0 12 \* \* \*", zone = TIME_ZONE) public void verificaPorHora() { 
            System.out.println(LocalDateTime.now()); 
            // Código que realiza a consulta de fluxo de vendas 
        }
    }
    

    Veja que agora estou enviando o Time Zone America/Sao_Paulo que é justamente o Time Zone utilizado aqui em São Paulo - SP, portanto, o agendamento poderá ser executado sem a preocupação de onde o projeto esteja alocado!

    Querendo conhecer o Spring? Que tal começar hoje mesmo na Formacao de Desenvolvedor Java Web com Spring? Nesta seleção de cursos, você irá aprender a criar uma aplicação Web bem robusta desde o zero com um dos frameworks mais famosos do mundo Java! Veja também todo nosso conteúdo de Java, Web, Spring, Hibernate, Testes e mais.

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Avalie este artigo

    • Foto de Alex Felipe

      Autor(a)

      Alex Felipe

      Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Atualmente cria conteúdo no canal https://www.youtube.com/@AlexFelipeDev.

    Explore por tópico

    • Back-end
    • Dados
    • DevOps
    • Front-end
    • Gestão & Negócios
    • Institucionais
    • Inteligência Artificial
    • Mobile
    • UX & Design

    Leia também

    • 15/09/2014

      Compact Profiles no Java 8

      Ler mais
    • Alura
      13/03/2016

      Herança e testes de unidade

      Ler mais
    • 04/03/2018

      O que é data class em Kotlin? Diferença entre class e data class e quando usar no Kotlin

      Ler mais
    Ver mais conteúdos

    Inscreva-se em nossa Newsletter

    Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.

    Institucional

    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status
    Institucional
    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status

    A Alura

    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes
    A Alura
    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes

    Conteúdos

    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Conteúdos
    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Alura