Arquivos

Posts Tagged ‘agendador’

Quartz + Tomcat ou Qualquer Servidor de App

Este é um passo a passo de como criar uma aplicação Web que tem uma tarefa agendada. Por exemplo, vamos supor que você tem uma aplicação Web, que eventualmente deve efetuar uma limpeza de dados em uma base. Você pode utilizar o quartz para isso (outra alternativa seria Ejb timer). Vamos la:

1- Baixe o Quartz (http://www.quartz-scheduler.org/)
2- Crie um projeto Web Dinâmico no Eclipse e nas dependencias do mesmo, coloque todas as bibliotecas do Quartz baixadas no passo anterior.
3- Crie as classes abaixo:
3.1- Tarefa

package com.br.infoserver.quartz;

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

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

/**
 * Esta classe demonstra uma tarefa que ira ser invocada pelo Quartz
 * Tem que implementar a interface Job do Quartz
 * @author julianom
 */
public class TarefaExemplo implements Job{
	/**
	 * Metodo que é executado quando a tarefa é invocada
	 */
	public void execute(JobExecutionContext context)
	throws JobExecutionException {
		// aqui vai a lógica da tarefa a ser chamada,
		// por exemplo, fazer um select no banco e enviar algum dado para uma fila MQ
		// Neste exemplo, vai somente imprimir no console a data de hoje no intervalo de 5 segundos
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy – hh:mm:ss");
		System.err.println("Rodou: " + dateFormat.format( new Date() ));
	}
}

3.2- Agendador, esta classe será invocada por um servlet na inicialização da aplicação WEB

package com.br.infoserver.quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Esta é a classe que deve ser invocada e irá disparar a tarefa nos momentos
 * determinados
 *
 * @author julianom
 *
 */
public class Agendador {

	public static void inicia() throws Exception {
		// Detalhes da tarefa
		JobDetail job = JobBuilder.newJob(TarefaExemplo.class).withIdentity(
				"tarefaAloMundo", "group1").build();
		// Gatilho - ou seja, quando irá chamar, neste caso, a cada 5 segundos
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity(
				"gatilhoAloMundo", "group1").withSchedule(
				CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();

		// Agenda e voa lá!
		Scheduler scheduler = new StdSchedulerFactory().getScheduler();
		scheduler.start();
		scheduler.scheduleJob(job, trigger);

	}

}

4- Crie um servlet, este Servlet deverá ser configurado para ser carregado na inicialização da aplicação, eu fiz isso utilizando annotation, dependendo de sua versão de Java, Apache, WebSphere, etc… vai ter que tirar do Servlet e colocar no arquivo web.xml

package com.br.infoserver.quartz.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.br.infoserver.quartz.Agendador;

/**
 * Servlet implementation class QuartzServlet
 */
@WebServlet(
		urlPatterns = { "/QuartzServlet" },
		initParams = {
				@WebInitParam(name = "load-on-startup", value = "2")
		})
public class QuartzServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public QuartzServlet() {
        super();
		try {
			Agendador.inicia();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

Pronto, simples e fácil. Basta efetuar o deploy de sua aplicação em seu servidor, e verá que neste exemplo ele ficará escrevendo a data no SystemOut do mesmo!

Enjoy!

Criando uma tarefa Agendada no Java com Quartz

Eventualmente temos a necessidade de ter um aplicativo Java que irá rodar seguindo uma determinada agenda, por exemplo, de 10 em 10 minutos, todos dia as 18 horas, etc…

Quartz é um componente que nos permite fazer isso com facilidade. Para criar uma aplicação simples, basta baixar o mesmo de quartz-scheduler.org , e criar uma aplicação com as libs do quartz no classpath da mesma, e ter pelo menos duas classes, uma que representa a TAREFA, e outra que representa a AGENDA. Seguem os exemplos:

- Tarefa

package com.br.infoserver.quartz;

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

/**
 * Esta classe demonstra uma tarefa que ira ser invocada pelo Quartz
 * Tem que implementar a interface Job do Quartz
 * @author julianom
 *
 */
public class TarefaExemplo implements Job{

/**
 * Metodo que é executado quando a tarefa é invocada
 */
 public void execute(JobExecutionContext context)
 throws JobExecutionException {
 // Obviamente, aqui vai a lógica da tarefa a ser chamada, nesta caso, vai imprimir no console
   SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy – hh:mm:ss");
   System.out.println("Rodou: " + dateFormat.format( new Date() ));
 }

}

- Agenda

package com.br.infoserver.quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Esta é a classe que deve ser invocada e irá disparar a tarefa nos momentos
 * determinados
 *
 * @author julianom
 *
 */
public class Agendador {

	public static void inicia() throws Exception {
		// Detalhes da tarefa
		JobDetail job = JobBuilder.newJob(TarefaExemplo.class).withIdentity(
				"tarefaAloMundo", "group1").build();
		// Gatilho - ou seja, quando irá chamar, neste caso, a cada 5 segundos
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity(
				"gatilhoAloMundo", "group1").withSchedule(
				CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();

		// Agenda e voa lá!
		Scheduler scheduler = new StdSchedulerFactory().getScheduler();
		scheduler.start();
		scheduler.scheduleJob(job, trigger);

	}

}

Finalmente, a classe principal que invoca a agenda:

package com.br.infoserver.quartz;
/**
 * Classe principal da aplicação que dispara as agendas
 * @author julianom
 *
 */
public class IniciaAgenda {

	public static void main(String[] args) {
		try {
			Agendador.inicia();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

Enjoy!

CategoriasJAVA Tags:, , , ,
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 151 outros seguidores