Quartz Part3

Antes de começar, não deixe de ver os post anterior Post1 e Post 2.

Agora irei falar sobre o framework Quartz para JEE, então irei criar um servlet, no qual será utilizado o Tomcat 6.0, mas poderia utilizar Jboss, Weblogic. Fique alerto para cada Servidor de Aplicação será necessário os respectivos libs. Lembrando estas libs vem junto com a lib do framework. Neste poste irei mostrar passo a passo, como construir um simples exemplo usando essa framework.

Pre-requisito:

Supondo que estes requisitos já esteja na sua máquina. Começando abra o eclipse e segue os passos.

Criar Projeto Novo, “Dynamic Web Project”. New->Other

Defina um nome para Projeto, Add : “ProjectQuartzWeb”, depois confere se o Tomcat foi marcado com o Servidor de Aplicação do Projeto.

Depois de criar o Projeto, vai até o pasta “src”, e cria o pacote “br.com.quartz”, no qual serão adicionados as classes do projetos.

Depois de criar os pacotes, crie os seguinte Serviços (O mesmo dos outros post). Adicione as seguintes classes abaixo:

Esse Classe “EnviarEmail”, nada mais que um serviço que envia um email.

package br.com.quartz;

import org.apache.commons.mail.SimpleEmail;

public class EnviarEmail {

	public static void main(String[] args)
	{
		SimpleEmail email = new SimpleEmail();

		try {
			email.setDebug(true);
			email.setHostName("smtp.gmail.com");
			email.setAuthentication("seu_login", "xxxxxxxxxx");
			email.setSSL(true);
			email.addTo("email_destinatario");
			email.setFrom("seu_email");
			email.setSubject("Testando");
			email.send();

		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}

	}

}

Aqui a Classe foi criado um JOB

package br.com.quartz;

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

public class EmailJob implements Job {

	public EmailJob() {

	}

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		EnviarEmail teste = new EnviarEmail();
		teste.main(null);

	}

}

A Classe que chama o serviço JOB, e determina o temporizador.

package br.com.quartz;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

public class ExecutarServico implements ServletContextListener{

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		  System.out.println("THE APPLICATION STOPPED");

	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {

		try {

			JobDetail job = newJob(EmailJob.class)
				    .withIdentity("myJob", "myGroup")
				    .storeDurably()
				    .requestRecovery()
				    .usingJobData("someKey", "someValue")
				    .build();

			Trigger trigger = newTrigger()
				      .withIdentity("myTrigger", "group1")
				      .startNow()
				      .withSchedule(simpleSchedule()
				          .withIntervalInSeconds(10)
				          .repeatForever())
				      .build();

			Scheduler sched = new StdSchedulerFactory().getScheduler();

			sched.scheduleJob(job, trigger);

			  sched.start();
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 // Tell quartz to schedule the job using our trigger

    }

}

Aqui, tem que criar um arquivo “quartz.properties”, no próprio “src”.

org.quartz.scheduler.instanceName = MeuApp
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

Duplo clik em web.xml, no Web XML Editor, procura “Listeners” -> Add -> “br.com.quartz.ExecutarServico”.

 ...

  br.com.quartz.ExecutarServico

 ...

Lembre-se que tem que adicionar os jar, na lib do projeto.

Caso você não consegui abaixar todas as libs, deixe um comentário com seu email e twitte este post, que irei encaminar os jar’s.

Quartz Parte2

No primeiro post, deu um pequeno exemplo de temporizador que roda em tempos em tempos, digo segundos em segundos. Mas se eu quero agendar que o meu sistema lança um job, em um determinado hora de cada dia do mês? É possível?

Sim, não muda quase nada, o que precisamos é do CronTrigger, e dos parametros de que controla do time. Seja abaixo os parametros que VOCÊ deve saber:

Expressão Significado
“0 0 12 * * ?” Dispara do meio dia de cada dia
“0 15 10 ? * *” Dispara 10:15 da manhã de cada dia
“0 15 10 * * ?” Dispara 10:15 da manhã de cada dia
“0 15 10 * * ? *” Dispara 10:15 da manhã de cada dia
“0 15 10 * * ? 2005” Dispara 10:15 da manhã de cada dia durante ano de 2005
“0 * 14 * * ?” Dispara a cada minuto a partir das 02:00 e terminando às 2:59 pm, todos os dias
“0 0/5 14 * * ?” Dispara a cada 5 minuto a partir das 02:00 e terminando às 2:55 pm, todos os dias
“0 0/5 14,18 * * ?” Dispara a cada 5 minutos a partir de duas horas e terminando às 2:55 pm, e disparar a cada 5 minutos a partir de 18:00 e terminando às 6:55 pm, todos os dias
“0 0-5 14 * * ?” Dispara a cada minuto a partir das 02:00 e terminando às 2:05 pm, todos os dias
“0 10,44 14 ? 3 WED” Dispara em 2:10 da tarde até 02:44 da tarde,isso toda quarta-feira no mês de março
“0 15 10 ? * MON-FRI” Dispara às 10:15 de toda segunda-feira, terça, quarta, quinta e sexta-feira
“0 15 10 15 * ?” Dispara às 10:15 horas do dia 15 de cada mês
“0 15 10 L * ?” Dispara às 10:15 no último dia de cada mês
“0 15 10 ? * 6L” Dispara às 10:15 na última sexta-feira de cada mês
“0 15 10 ? * 6L 2002-2005” Dispara às 10:15 em cada última sexta-feira de cada mês durante os anos 2002, 2003, 2004 e 2005
“0 15 10 ? * 6#3” às 10:15 na terceira sexta-feira de cada mês

Neste post não irei tratar como instalar o framework Quartz,isso pode ser visto no post anterior.O códigos abaixo é referente a parte1, aproveitando a idéia do serviço, mas mostrando um jeito diferente de disparo do serviço.


package br.com.chikasawa.teste;

import org.apache.commons.mail.SimpleEmail;

public class EnviarEmail {

	public static void main(String[] args)
	{
		SimpleEmail email = new SimpleEmail();

		try {
			email.setDebug(true);
			email.setHostName("smtp.gmail.com");
			email.setAuthentication("seu_login", "sua_senha");
			email.setSSL(true);
			email.addTo("email_destinatario@gmail.com");
			email.setFrom("seu_email@gmail.com");
			email.setSubject("Testando");
			email.send();

		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}

	}

}

Essa Classe, cria-se um Job.

package br.com.chikasawa.teste;

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

public class EmailJob implements Job {

	public EmailJob() {

	}

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		EnviarEmail teste = new EnviarEmail();
		teste.main(null);

	}

}

Criei um job que despara todos os dias 31 de cada mês no horário 9:32 da manhã.

package br.com.chikasawa.teste;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.JobBuilder.*;
import static org.quartz.CronScheduleBuilder.*;

public class ExecTarefa {

	public static void main(String[] args) throws SchedulerException
	{
		JobDetail job = newJob(EmailJob.class)
			    .withIdentity("myJob", "myGroup")
			    .storeDurably()
			    .requestRecovery()
			    .usingJobData("someKey", "someValue")
			    .build();

		CronTrigger trigger = newTrigger()
			    .withIdentity("trigger1", "group1")
			    .withSchedule(cronSchedule("0 32 9 31 * ?"))
			    .build();

		Scheduler sched = new StdSchedulerFactory().getScheduler();
		 // Tell quartz to schedule the job using our trigger
		  sched.scheduleJob(job, trigger);

		  sched.start();

	}

}

Procurei mostra neste post, um forma diferente em agendar suas tarefas, serviços.

Mais informações, nada melhor que o site do framework.

Quartz

Olá pessoal, hoje escreverei um mini exemplo, utilizando o framework Quartz, open source. Essa ferramenta permite você agendar(scheduler) um tipo de tarefas. Objetivo deste post não é ensinar instalar o framework, além do que o google existe vários tutoriais. Mas sim, mostrar um serviço que enviará email’s , em tempos em tempos. Concordo que não é um melhor exemplo para mostrar para vocês. Mas irá ajudar muitos a dar um ponta pé nos seus estudos.

Jar necessário para alguns jar

JavaMail API 1.4.5
Commons Email 1.X

Este serviço abaixo, envia um email.


package br.com.chikasawa.teste;

import org.apache.commons.mail.SimpleEmail;

public class EnviarEmail {
	
	public static void main(String[] args)
	{
		SimpleEmail email = new SimpleEmail();
		
		try {
			email.setDebug(true);
			email.setHostName("smtp.gmail.com");
			email.setAuthentication("seu_login", "sua_senha");
			email.setSSL(true);
			email.addTo("email_destinatario@gmail.com");
			email.setFrom("seu_email@gmail.com");
			email.setSubject("Testando");
			email.send();
			
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
		
	}

}

Essa Classe, cria-se um Job.

package br.com.chikasawa.teste;

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

public class EmailJob implements Job {

	public EmailJob() {
	
	}
	
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		EnviarEmail teste = new EnviarEmail();
		teste.main(null);
		
	}		

}

Criamos uma trigger que em 40 segundos ele dispara um job, ou seja, em tempo em tempos o sistema envia um email para o destinatário.

package br.com.chikasawa.teste;

import org.quartz.JobDetail;  
import org.quartz.Scheduler;  
import org.quartz.SchedulerException;  
import org.quartz.Trigger;  
import org.quartz.impl.StdSchedulerFactory;  
import static org.quartz.TriggerBuilder.*;
import static org.quartz.JobBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;

public class ExecTarefa {

	public static void main(String[] args) throws SchedulerException
	{
		JobDetail job = newJob(EmailJob.class)
			    .withIdentity("myJob", "myGroup")
			    .storeDurably()
			    .requestRecovery()
			    .usingJobData("someKey", "someValue")
			    .build();
		
		Trigger trigger = newTrigger()
			      .withIdentity("myTrigger", "group1")
			      .startNow()
			      .withSchedule(simpleSchedule()
			          .withIntervalInSeconds(40)
			          .repeatForever())            
			      .build();
		
		Scheduler sched = new StdSchedulerFactory().getScheduler();  
		 // Tell quartz to schedule the job using our trigger
		  sched.scheduleJob(job, trigger);		  
		  sched.start(); 		
	}
}

Este exemplo demostrado aqui é para Java SE, em outro post, irei falar sobre Quartz para JEE. Eu aberto a sugestões e críticas.

Blog no WordPress.com.

Acima ↑