GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Agendar Tarrefas no Web.XML [RESOLVIDO]


#1

Estou precisando que todo dia as 10:00h , execute uma classe ...

Podendo ser pelo web.xml ( mais viavel )....

Podendo dar exemplos tanto para Tomcat ou para Jboss, eu uso tomcat , mas para qm usa jboss já tem aqui esse topico !

Ajudem -me . Obrigado


#2

Oi!

Não é possível fazer isso pelo web.xml. Tem várias API's que tornam isso possível, a mais conhecida é o quartz. Acredito que você consiga utilizar no tomcat sem problemas. ( no JBoss tenho certeza que funciona pois já utilizei)

Na especificação JavaEE 7 também tem uma API nova, se não me engano definida pela JSR 352 (Batch Processing for Java Platform). Nesse caso você dificilmente vai poder usar no Tomcat, vai ter que ser um servidor Java EE 7, e nem sei se já existe algum completamente compatível com JavaEE 7 por ai. Talvez só o Glassfish.

Mais seguro usar Quartz mesmo. Nao é nada de outro mundo não:

http://quartz-scheduler.org/


#3

É como o Rodrigo falou,

Use o quartz com o Tomcat que é tranquilo, apenas coloque o jar do quartz dentro da pasta lib do projeto Web e o utilize para fazer o agendamento, você pode criar um Servlet e iniciá-lo no Web.xml com 1 , assim quando o Tomcat subir ele executa essa servlet e realiza o agendamento. Pode-se usar o web.xml também para definir a hora da execução do método.

No JBoss existe uma solução de Scheduler proprietária (scheduler-plugin.jar) no qual você pode criar um componente novo que fique apenas com a responsabilidade do agendamento e exportá-lo como um arquivo .sar e realizar o deploy. Quando o JBoss iniciar ele varre o diretório em busca de arquivos .sar e executa o agendamento.


#4

No imperativo? Sim senhor!

Como já dito, vá de quartz.


#5

Qualquer Application Server (TomEE, JBoss, Glassfish, Weblogic, Websphere e afins) que suportem a especificação JEE 6 possuem APIs para uso do @Schedule.
Se vai utilizar o tomcat, quartz resolve.


#6

Ultilizando o QUARTZ como todos falaram ficou assim no TomCat

Eu fiz o de 3 em 3 minuto funcionou ... mas como eu agendo o dia e hora ???

Aqui abaixo está o que funcionou de 3 em 3 minutos...

Web.xml

<listener>
    <listener-class>br.com.geosecure.logica.MeuScheduler</listener-class>
  </listener>

MeuSheduler

package br.com.geosecure.logica;
import java.util.Date;  
import javax.servlet.ServletContextEvent;  
import javax.servlet.ServletContextListener;  
import org.apache.log4j.Logger;  
import org.quartz.JobDetail;  
import org.quartz.ObjectAlreadyExistsException;
import org.quartz.Scheduler;  
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;  
	public class MeuScheduler implements ServletContextListener {
		 public static Scheduler sched;
		 private Logger log;
		 @SuppressWarnings("static-access")
		 protected void init() throws ObjectAlreadyExistsException {
		  try {
		   /* Fábrica para criar instância de Scheduler */
		   StdSchedulerFactory schedFactory = new StdSchedulerFactory();
		   getLog().info("---------------- Criar Agendador ----------------");
		   MeuScheduler.sched = schedFactory.getScheduler();
		   /* ************************Inicio Job Hora *****************************/
		   getLog().info("---------------- Criando Tarefa: JobHora para ser executada a cada 3 minutos ----------------");
		   JobDetail jobHora = new JobDetail("JobIntegraBysoft",Scheduler.DEFAULT_GROUP, JobHora.class);
		   getLog().info("---------------- Criar Gatilho Job Hora  ----------------");
		   SimpleTrigger sptJobHora = new SimpleTrigger("JobHora", sched.DEFAULT_GROUP, new Date(), null, SimpleTrigger.REPEAT_INDEFINITELY, 180L * 1000L);
		   getLog().info("---------------- Faz o Agendamento de JobHora ----------------");
		    sched.scheduleJob(jobHora, sptJobHora);
		   /* ************************ Fim Job Hora *******************************/
		   /* Iniciar execução do Scheduler */
		   MeuScheduler.sched.start();   
		  } catch (Exception e) {
		   System.out.println("\n\nErro ao tentar iniciar Scheduler .\n\n");
		   e.printStackTrace();
		  }
		 }
		 public void contextInitialized(ServletContextEvent ce) {
		  try{
		   init();
		  }catch (Exception ex) {
		   ex.getStackTrace();
		  }
		 }
		 public void contextDestroyed(ServletContextEvent arg0) {
		  // Finaliza o schedule
		  restart();
		 }
		 public void restart() {
		  try {
			  MeuScheduler.sched.shutdown(true);
		  } catch (Exception ex) {
		   getLog().error("Erro ao tentar reiniciar as tarefas");
		   getLog().error(ex.getMessage(), ex);
		  }
		 }
		 protected Logger getLog() {
		  if (this.log == null) {
		   this.log = Logger.getLogger("AÇÃO : ");
		  }
		  return this.log;
		 }
		}

Meu Job

public class JobHora implements Job {
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		System.out.println("3 em 3 minutos");
	}
}

#7

Consegui fazer usando o Quartz 2.2 e seguindo esse tutorial ...

http://imasters.com.br/artigo/23593/java/entenda-como-funciona-o-quartz-enterprise-job-scheduler/


#8

Certíssimo! Não sabia que tinha isso no EJB 3.1! Ficou muito bom, inclusive. Parecido com o que já existia no JBoss Seam.


#9

Tem e ficou muito bom mesmo.
Eu me surpreendo sempre com as coisas que a especificação 3.1 e 3.2 trouxeram, quase todas sempre simples e funcionais.


#10

Rodrigo ver se consegue em ajudar, estou usando o Jboss tenho que colocar algum .jar ou outro arquivo de configuração dentro do servidor? Quais arquivos? Em qual diretório? Obrigado