Quartz Scheduler - como colocar para ser executado de 1 em 1 hora

O código abaixo é executado apenas as 18:05.
Como fazer para executá-lo de 1 em 1 hora?

Trigger trigger = TriggerUtils.makeDailyTrigger("Tarefa", 18, 05);//aqui utilizamos o "makeDailyTrigger" que executa a tarefa determinada hora/minuto  
		 
		trigger.setName("Tarefa");
		
		JobDetail jobDetail = new JobDetail("Tarefa", "Tarefa Group", AgendamentoTarefasImpl.class);
		//definimos o JobDetail com o nome da tarefa, o grupo e a classe que contém a tarefa a ser executada  
		
		Scheduler scheduler;
		
		try{
			scheduler = new StdSchedulerFactory().getScheduler();
			scheduler.scheduleJob(jobDetail, trigger);
			scheduler.start();
			System.out.println("Iniciado");
		}
		catch (SchedulerException e) {
			e.printStackTrace();
		}

Obrigado desde já!

Cara,

da uma olhada no CronTrigger, http://www.quartz-scheduler.org/documentation/quartz-1.x/examples/Example3

t+

A melhor coisa a ser feita é utilizar mapeamento por xml.

Caso você queira você não necessitará recompilar o código, apenas alterar o xml.

Poderia me dar um exemplo no mapeamento xml?

Olá!

Ai vai um exemplo ( a classe EmailJob é executada a cada 10 minutos):

Arquivo quartz-jobs.xml

<?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>EmailJob</name>
	               <group>DEFAULT</group>
	               <description>Verifica se existe email pendente para envio</description>
	               <job-class>meuPackage.EmailJob</job-class>
	          </job-detail>
	          <trigger>
	               <cron>
	                    <name>EmailTrigger</name>
	                    <group>DEFAULT</group>
	                    <job-name>EmailJob</job-name>
	                    <job-group>DEFAULT</job-group>
	                    <cron-expression>0 0/1 * * * ?</cron-expression>
	                    <!--
	                    Essa cron será executada a cada 10 minutos
	                    Referência para cron-expression: http://en.wikipedia.org/wiki/CRON_expression
	                    -->
	               </cron>
	          </trigger>
	     </job>
	</quartz>

Ai vc cria um arquivo quartz.properties com um conteúdo parecido com este:

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

	#===============================================================
	#Configure ThreadPool
	#===============================================================
	org.quartz.threadPool.threadCount =  3
	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 = 10
	org.quartz.plugin.jobInitializer.validating=false
        org.quartz.plugin.jobInitializer.fileName =quartz-jobs.xml

Mapeia no web.xml:

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

Não me lembro se precisava baixar um plugin…

Mas se vc precisar, tem mais informações no site do Quartz Scheduler.

Até +!

ok. vo fazer aki qqr coisa te aviso

Fiz isso que vc me disse, mas nem sinal do Job funcionar. Antes desse seu exemplo tinha colocado ele num static void main em outra config, mas também não funciona. quando a aplicação subir, tenho q fazer algo ha mais?

Desculpe jonatex, faltou uma parte! :?

Na classe que executa o Job vc coloca mais ou menos assim:

public class MeuJob implements Job {

 public void execute(JobExecutionContext context) throws JobExecutionException {
        try {                                   

               //Aqui vc coloca os métodos a serem executados!!!

           }

        catch (Exception ex) {
            SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
            System.out.println("Erro na Job às " + df.format(new Date()));
            System.out.println("Mensagem de erro: " + ex.getMessage());
        }
    }

}

Que eu me lembre não precisa fazer mais nada, pois o web.xml já informa ao container/servidor-web/etc que deve ser executado da forma como o quartz-properties está configurado.

Até +!

Ainda não funcionou. Estranho d+

Nada ainda?

Você está usando qual servidor web ai?

Ah, outro detalhe: os arquivos quartz-jobs.xml e quartz.properties devem ficar no mesmo diretório, em um lugar que possa ser lido pela app, como por exemplo, em WEB-INF/classes.

Até +!

Estou utilizando apache tomcat 7. Estou colocando os 2 arquivos na raiz de web-INF

Ah, você configurou o listener?

No web.xml:

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

Tenta ai! :slight_smile:

Se não der certo, posta como está o sua configuração com a CRON.

Até +!

Agora deu o seguinte erro

828 [Thread-2] INFO org.quartz.ee.servlet.QuartzInitializerListener - Quartz Initializer Servlet loaded, initializing Scheduler...
828 [Thread-2] ERROR org.quartz.ee.servlet.QuartzInitializerListener - Quartz Scheduler failed to initialize: org.quartz.SchedulerException: Properties file: 'quartz.properties' could not be read. [See nested exception: java.io.FileNotFoundException: quartz.properties (O sistema não pode encontrar o arquivo especificado)]
org.quartz.SchedulerException: Properties file: 'quartz.properties' could not be read. [See nested exception: java.io.FileNotFoundException: quartz.properties (O sistema não pode encontrar o arquivo especificado)]
	at org.quartz.impl.StdSchedulerFactory.initialize(StdSchedulerFactory.java:492)
	at org.quartz.impl.StdSchedulerFactory.<init>(StdSchedulerFactory.java:296)
	at org.quartz.ee.servlet.QuartzInitializerListener.contextInitialized(QuartzInitializerListener.java:145)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723)
	at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226)
	at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: quartz.properties (O sistema não pode encontrar o arquivo especificado)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at org.quartz.impl.StdSchedulerFactory.initialize(StdSchedulerFactory.java:487)
	... 10 more

Como disse anteriormente os 2 arquivos se encontram em WEB-INF…

Bom, já é um sinal que a coisa ta rodando! rs

O erro é de arquivo não encontrado… então:

  1. Tenta colocar não na raiz da WEB-INF, mas em WEB-INF/classes, por exemplo.

  2. Se não der, tenta colocar o caminho todo do arquivo no web.xml:

<context-param> <param-name>config-file</param-name> <param-value>WEB-INF/classes/quartz.properties</param-value> </context-param>

Até +!

Outro erro

GRAVE: Exception sending context initialized event to listener instance of class org.quartz.ee.servlet.QuartzInitializerListener java.lang.NoSuchMethodError: org.quartz.plugins.xml.JobInitializationPlugin.getLog()Lorg/apache/commons/logging/Log; at org.quartz.plugins.xml.JobInitializationPlugin.initialize(JobInitializationPlugin.java:245) at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1245) at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1460) at org.quartz.ee.servlet.QuartzInitializerListener.contextInitialized(QuartzInitializerListener.java:152) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723) at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226) at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

Bom dia!

Estranho esse erro, mas ele ta reclamando que não achou o método getLog() do org.apache.commons.logging.Log.

Tenta fazer os imports:


import java.util.logging.Level;
import java.util.logging.Logger;

E tenta colocar na classe do Job mais ou menos assim:


catch (Exception ex) {
            SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
            System.out.println("Erro na Job às " + df.format(new Date()));
            System.out.println("Mensagem de erro: " + ex.getMessage());
            Logger.getLogger(MeuJob.class.getName()).log(Level.SEVERE, null, ex);
        }

Cara da uma lida nos exemplos que estão no site, de repente tem algum FAQ sobre esse erro.

Até +!