Introdução ao Quartz

Em projetos WEB, é comum surgir a necessidade de execução de tarefas periódicas e sem a interferência do usuário. Essas tarefas podem ser desde notificações por e-mail para usuários com contas expirando até processos mais complexos de inclusão, atualização ou exclusão de dados.

Uma ferramenta bastante difundida para executar esse trabalho é o Quartz, mantido pela Terracota, o qual consiste em uma ferramenta completa para agendamento de tarefas que pode ser associada a praticamente qualquer projeto Java EE ou Java SE.

Seu processo de configuração é relativamente simples, principalmente depois que o mesmo é feito pela primeira vez, pois nos projetos subsequentes os arquivos podem ser duplicados e os ajustes necessários são mínimos.

Para demonstrar a utilização do Quartz, será criado um projeto Dynamic Web Project em branco no Eclipse. Nele serão inseridas as bibliotecas necessárias, criados os arquivos de configuração e no final uma classe que implementará a interface org.quartz.Job.

Para configurar o projeto, serão necessárias as seguintes bibliotecas:

  • commons-beanutils-1.7.0.jar
  • commons-digester-1.8.jar
  • commons-logging-1.1.jar
  • jta.jar
  • quartz-1.6.6.jar

E os seguintes arquivos de configuração:

  • quartz-jobs.xml
  • quartz.properties

Além de uma pequena modificação no arquivo web.xml

Ao final da configuração você deverá ter uma estrutura semelhante à imagem a seguir:

O primeiro passo é declarar o listener do quartz e o nome do arquivo de configurações no web.xml, conforme modelo a seguir:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 id="WebApp_ID" version="2.5">
 <display-name>quartz</display-name>
 <welcome-file-list>
 <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

 <listener>
 <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
 </listener>

 <context-param>
 <param-name>config-file</param-name>
 <param-value>quartz.properties</param-value>
 </context-param>
</web-app>

No web.xml ficou definido o quartz.properties como arquivo de configurações. O modelo abaixo poderá ser utilizado em praticamente qualquer projeto:

#===============================================================
#Configure Main Scheduler Properties
#===============================================================
org.quartz.scheduler.instanceName = QuartzScheduler
org.quartz.scheduler.instanceId = AUTO

#===============================================================
#Configure ThreadPool
#===============================================================
org.quartz.threadPool.threadCount =  5
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

#===============================================================
#Configure JobStore
#===============================================================
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#===============================================================
#Configure Plugins
#===============================================================
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin

org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = false
org.quartz.plugin.jobInitializer.scanInterval = 30
org.quartz.plugin.jobInitializer.validating=false
org.quartz.plugin.jobInitializer.fileName=quartz-jobs.xml

No arquivo quartz.properties, definiu-se que o arquivo quartz-jobs.xml será o responsável pelas configurações das tarefas. Nesse arquivo, você irá criar os jobs que necessitar e também definir qual a periodicidade da sua execução. Essa última parte é configurada através de uma cron-expression. Declarar um job é relativamente simples, conforme você pode ver no arquivo quartz-jobs.xml desse projeto:

<?xml version="1.0" encoding="ISO-8859-1"?>
<quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" overwrite-existing-jobs="true">
     <job>
          <job-detail>
               <name>NomeDoJob</name>
               <group>DEFAULT</group>
               <description>Descricao</description>
               <job-class>br.com.k2studio.quartz.job.SimpleJob</job-class>
          </job-detail>
          <trigger>
               <cron>
                    <name>TriggerDoJob</name>
                    <group>DEFAULT</group>
                    <job-name>NomeDoJob</job-name>
                    <job-group>DEFAULT</job-group>
                    <cron-expression>0 0/1 5-23 ? * 2,3,4,5</cron-expression>
                    <!--
                    Essa cron será executada todos os minutos de segunda a quinta, das 5 às 23 horas.
                    Referência para cron-expression: http://en.wikipedia.org/wiki/CRON_expression
                    -->
               </cron>
          </trigger>
     </job>
</quartz>

No job declarado, definiu-se que a classe SimpleJob.java seria a responsável pela execução da tarefa. Essa classe deve implementar a interface Job, como foi dito no inicio do post. Ao implementar essa interface, a classe irá conter o método execute, o qual será chamado cada vez que o job for solicitado.

Segue a implantação da classe SimpleJob.java:

package br.com.k2studio.quartz.job;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SimpleJob implements Job {

     @Override
     public void execute(JobExecutionContext context) throws JobExecutionException {
          SimpleDateFormat df = new SimpleDateFormat("HH:mm");
          System.out.println("Job executado com sucesso às " + df.format(new Date()));
     }

}

Ao executar o projeto, o resultado no console será o seguinte:

Download do projeto: Download

Share on Facebook

Responses to Introdução ao Quartz

  1. Desiree_CEFET disse:

    Obrigada estava procurando exatamente HOWTO assim \o/

  2. Ricardo disse:

    Ficou ótimo esse tutorial!

Post a comment