Quartz Scheduler - como colocar para ser executado de 1 em 1 hora
15 respostas
J
jonatex
O código abaixo é executado apenas as 18:05.
Como fazer para executá-lo de 1 em 1 hora?
Triggertrigger=TriggerUtils.makeDailyTrigger("Tarefa",18,05);//aqui utilizamos o "makeDailyTrigger" que executa a tarefa determinada hora/minuto trigger.setName("Tarefa");JobDetailjobDetail=newJobDetail("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 Schedulerscheduler;try{scheduler=newStdSchedulerFactory().getScheduler();scheduler.scheduleJob(jobDetail,trigger);scheduler.start();System.out.println("Iniciado");}catch(SchedulerExceptione){e.printStackTrace();}
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.
J
jonatex
Poderia me dar um exemplo no mapeamento xml?
V
vinnysoft
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"?><quartzxmlns="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>Verificaseexisteemailpendenteparaenvio</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>00/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:
Mas se vc precisar, tem mais informações no site do Quartz Scheduler.
Até +!
J
jonatex
ok. vo fazer aki qqr coisa te aviso
J
jonatex
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?
V
vinnysoft
Desculpe jonatex, faltou uma parte! :?
Na classe que executa o Job vc coloca mais ou menos assim:
publicclassMeuJobimplementsJob{publicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException{try{//Aqui vc coloca os métodos a serem executados!!!}catch(Exceptionex){SimpleDateFormatdf=newSimpleDateFormat("HH:mm:ss");System.out.println("Erro na Job às "+df.format(newDate()));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é +!
J
jonatex
Ainda não funcionou. Estranho d+
V
vinnysoft
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é +!
J
jonatex
Estou utilizando apache tomcat 7. Estou colocando os 2 arquivos na raiz de web-INF
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)
V
vinnysoft
Bom dia!
Estranho esse erro, mas ele ta reclamando que não achou o método getLog() do org.apache.commons.logging.Log.
E tenta colocar na classe do Job mais ou menos assim:
catch(Exceptionex){SimpleDateFormatdf=newSimpleDateFormat("HH:mm:ss");System.out.println("Erro na Job às "+df.format(newDate()));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.