Dev (Back & Front)ARTIGO

Entenda como funciona o Quartz Enterprise Job Scheduler

O Quartz é um serviço de agendamento de tarefas que pode ser integrado, ou utilizado virtualmente, em qualquer aplicação Java SE ou Java EE. A ferramenta pode ser utilizada para criar agendas que executam milhares de tarefas, que são definidas utilizando componentes padrão da plataforma Java, que são codificados para suprir as necessidades da aplicação. O Quartz Scheduler fornece diversos recursos corporativos, como suporte a transações JTA ou clusterização.

O Quartz é um serviço de agendamento de tarefas que pode ser integrado, ou utilizado virtualmente, em qualquer aplicação JavaJava42 conteúdosNovidades do Java 26 (para desenvolvedores)Dev (Back & Front) · mar 2026Visual Studio Code para Java: o guia completo (dicas, configuração e extensões)Dev (Back & Front) · out 2025Quarkus: Modernizando a linguagem Java para a era da nuvemDev (Back & Front) · nov 2020Ver tudo em Dev (Back & Front) SE ou Java EE. A ferramenta pode ser utilizada para criar agendas que executam milhares de tarefas, que são definidas utilizando componentes padrão da plataforma Java, que são codificados para suprir as necessidades da aplicação. O Quartz Scheduler fornece diversos recursos corporativos, como suporte a transações JTA ou clusterização.

O Scheduler é o componente principal do Quartz e é o responsável por gerenciar a execução de jobs. A partir dele, o desenvolvedor pode agendar, iniciar e parar as execuções. Para construir um Scheduler, deve-se utilizar uma classe que implementa o padrão de projeto Factory no Quartz, representado pela interface SchedulerFactory. Existem duas classes que implementam esta interface: StdSchedulerFactory e DirectSchedulerFactory. A primeira permite a utilização de um arquivo properties para configuração e a segunda implementa um segundo padrão de projeto: o Singleton.

Após obter um Scheduler, pode-se iniciar a execução do agendamento a partir do método start(), agendar novos jobs com o scheduleJob() e parar o agendador com o shutdown(). Ao se agendar um job com o método scheduleJob(), é necessário definir dois parâmetros:

  • O primeiro define o job que será executado, representado pela interface Job;
  • O segundo define o trigger, representado pela interface Trigger, que corresponde às condições de agendamento para execução do job em questão.

O que é um job?

Um job é uma tarefa a ser executada, que no Quartz nada mais é do que uma classe que implementa a interface Job e que agrega todo o código necessário para fazer a funcionalidade específica do job em questão. Ele pode, também, receber parâmetros para seu funcionamento correto e isso é feito a partir da classe JobDetail.

Ao implementar a interface Job, deve-se implementar também o método execute(), que recebe como parâmetro um JobExecutionContext e lança uma exceção do tipo JobExecutionException. Dentro do método execute() estará todo o código referente ao job em questão. Um exemplo de job é uma varredura automática de spams em um e-mail, ou, uma busca por tags duplicadas de um produto para limpeza em um banco de dadosBanco de dados134 conteúdosSQL ou NoSQL: eis a questão!!Data · mar 2020Banco de dados: como organizar e dar segurança para milhões de dados de loteriasData · mai 20215 serviços gratuitos na cloud para bancos de dados PostgresData · fev 2025Ver tudo em Data de algum comércio eletrônicoE-commerce21 conteúdosECBR Club: novo espaço para devs se conectarem ao ecossistema de e-commerceDev (Back & Front) · mai 2025TOTVS anuncia joint venture com VTEXMarketing Tech · mai 2019Jovens da Brasilândia recebem formação gratuita em tecnologiaGestão Dev & TI · jul 2025Ver tudo em Marketing Tech .

Para a criação de um job, utiliza-se a classe JobBuilder, que define a classe do job implementado a partir do método newJob(), a identidade no método withIdentity() e a instanciação do mesmo no build().

O que é o trigger?

Um objeto trigger é utilizado para disparar a execução de jobs. Quando um job é agendado, a instância de um trigger é feita e suas propriedades são configuradas para satisfazer o agendamento necessário para a aplicação. Existem alguns triggers pré-definidos na biblioteca Quartz, como, por exemplo, o SimpleTrigger e o CronTrigger.

Para a construção de um trigger, é utilizada a classe TriggerBuild, que implementa métodos utilizando o Domain Specific Language (DSL) e permite a configuração dos dados do trigger, como, por exemplo, sua identidade, a partir do método withIdentity(); seus dados de agendamento, a partir do método withSchedule(), e a instanciação do trigger, a partir do método build(). Esse último retorna uma classe que implementa a interface Trigger.

O CronTrigger é um tipo de trigger que é útil para agendamentos baseados em calendários, como, por exemplo, “uma execução deve ocorrer às quartas e quintas às 12:00h” ou “uma execução deve ocorrer todos os dias às 08:00h”, e assim por diante. Ele é construído quando se define um agendamento do tipo CronSchedule no método TriggerBuild.withSchedule. Este tipo de agendamento é construído a partir do método estático cronSchedule da classe CronScheduleBuilder, que recebe como parâmetro uma expressão cron.

Para formar uma expressão cron, alguns requisitos devem ser satisfeitos. Primeiramente, deve-se conhecer a ordem dos parâmetros:

  1. Segundos;
  2. Minutos;
  3. Horas;
  4. Dia do mês;
  5. Mês;
  6. Dia da semana;
  7. Ano (opcional).

Por exemplo, uma expressão cron que será executada todas às quartas-feiras às 12:00pm é escrita da seguinte forma: “0 0 12 ? * WED”. Outro exemplo de expressão demonstra uma tarefa executada todos os dias, às 08:00am e 12:00pm: “0 0 8,12 * * *”.

Exemplo

Para ilustrar todos os conceitos apresentados anteriormente, foi desenvolvido um exemplo simples, que simula a utilização de um CronTrigger e define um job customizado que implementa a interface Job. Ele será responsável por exibir uma mensagem de texto simples indicando que foi executado a cada dez segundos todos os dias. O código do job foi definido conforme a listagem abaixo:

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        System.err.println("Servico executado conforme agendamento");
    }
}

A classe principal que faz a execução deste job foi definida conforme a listagem a baixo:

public class Main {
    public static void main(String[] args) {
        try {
            SchedulerFactory schedFact = new StdSchedulerFactory();
            Scheduler sched = schedFact.getScheduler();
            sched.start();
            JobDetail job = JobBuilder.newJob(MyJob.class)
                .withIdentity("myJob", "group1")
                .build();
            Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?"))
                .build();
             sched.scheduleJob(job, trigger);
        } catch (Exception e) {
            System.out.println("erro");
            e.printStackTrace();
        }
    }
}

Neste exemplo de código, obtem-se uma instância de Scheduler a partir da Factory StdSchedulerFactory. O agendamento é iniciado, depois cria-se um novo job, do tipo MyJob, um novo CronTrigger que possui a expressão cron “0/10 * * * * ?”, que significa “a cada dez segundos”, e o job é agendado conforme o trigger criado.

Conclusão

Apesar de ser um exemplo simples, com ele é possível verificar o funcionamento de cada componente necessário para a execução de um job agendado, e a partir dele é possível ver sua aplicabilidade no cenário de alguma aplicação que tenha estas necessidades.

Referências

é bacharel em Ciência da Computação (CESUFOZ) e especialista em Projeto e Desenvolvimento de Sistemas Baseados em Objetos para Ambiente Internet (UTFPR). Possui certificações Zend Certified Engineer PHP 5.3, ZCE PHP 5 e ZCE Zend Framework. Atualmente é Analista de Sistemas no Instituto de Tecnologia Aplicada e Inovação (ITAI), desenvolvendo interfaces web para aplicações de monitoramento de redes elétricas e disjuntores com as tecnologias Java, Spring Framework, Primefaces, HTML5, CSS3, PHP, Zend Framework, Apache Lucene e Doctrine 2.

Ver perfil