Quartz e Tomcat

Alguém já usou o quartz integrado com o tomcat? Funciona legal?
Alguém teria algum material para recomendar?

Vc ta falando do quartz em alguma aplicação que roda no tomcat?
Se for é bem tranquilo, eu uso a integração do quartz com o spring, mas já usei ele sozinho também e funcionou legal .
Da uma olhada na documentação que ela é bem legal também.

http://www.opensymphony.com/quartz/

Já fiz uma aplicação Web onde um servlet iniciava o Quartz. Então, quando subia o Tomcat, ele iniciava o Servlet que chamava o scheduller do quartz. Muito tranquilo. Deu super certo.
:slight_smile:

[quote=lilikadias]Já fiz uma aplicação Web onde um servlet iniciava o Quartz. Então, quando subia o Tomcat, ele iniciava o Servlet que chamava o scheduller do quartz. Muito tranquilo. Deu super certo.
:)[/quote]

Poderia colocar um exemplo? Como você configurou o quartz e o tomcat?

No meu caso eu tinha uma aplicação Web, só coloquei um .jar dentro da pasta lib com as classes que o quartz utliza para fazer meu agendamento, por exemplo, fiz uma classe DisparaJobScheduler com os dados do agendamento e uma classe DisparaJob que tem o método execute com a lógica a ser executada.
No web.xml configurei o Servlet normalmente:

 <!-- Initialize the QuartzApp -->
    <servlet>  
	        <servlet-name>quartz</servlet-name>  
	        <servlet-class>com.test.timer.DisparaJobScheduler</servlet-class>  
      	        <load-on-startup>1</load-on-startup>    
    </servlet>

Isso faz com que, assim que o Tomcat seja iniciado, ele leia essa classe Scheduler faça o agendamento. Depois do agendamento, é disparado o Job no intervalo e horário que vc configurou no Scheduler.

Não precisa de nenhuma configuração no Tomcat. Só colocar a lib dentro de uma webapp. =)

Abraços!

Muito obrigado pela dica, vou fazer isso…
Agora uma ooutra dúvida se o tomcat cair todos os processos que estavam agendados são perdidos? E se ficar agendando muitos processos, a aplicação corre o risco de ficar mais lenta e fica consumindo mais memória?

Sim, se o tomcat cair pára todos os processos e quando ele subir novamente ele reagenda tudo. Isso é ruim porque se vc tem um processo rodando de hora em hora e o tomcat cair, ele só vai subir no horário configurado pra depois continuar de hora em hora. Com isso seu processo pode ficar 23 horas sem rodar.

Quanto a consumir mais memória eu não tenho certeza, mas acredito que sim.

E é preciso configurar alguma coisa? Ou já agendando o processo o tomcat já “salva” o agendamento?

Não precisa configurar, o Tomcat vai ler os dados de agendamento na classe Scheduler e vai executando o Job de acordo com as informações setadas nessa classe. Por exemplo:

...
java.util.Calendar startTime = java.util.Calendar.getInstance();
		//seta a hora de disparo
		startTime.set(java.util.Calendar.HOUR_OF_DAY, Integer.parseInt(hrDisparo));
		startTime.set(java.util.Calendar.MINUTE, 0);
		startTime.set(java.util.Calendar.SECOND, 0);
		startTime.set(java.util.Calendar.MILLISECOND, 0);

		//if the startTime will be before the current time, move to next day
		if (startTime.getTime().before(new Date())) {
		   startTime.add(java.util.Calendar.DAY_OF_MONTH, 1);
		}
...
trigger.setRepeatInterval(Xhoras);
...

Vc pode deixar essas informações de hora de disparo, intervalo, etc configuráveis no web.xml.

O problema é que o usuário pode setar o horário que o processo vai rodar.
Eu pego as informações do banco e agendo.

Entendi, então na classe Scheduler vc pega as informações do banco toda vez que o Tomcat for iniciado para fazer o agendamento.

Quanto ao usuário setar o horário, terá uma aplicação Web onde ele irá setar isso?

Se sim, vc pode gravar no bd os novos dados do agendamento e chamar o método: sched.rescheduleJob(…).
Isso vai reagendar as triggers do quartz.

Att.

Entendi, vou fazer isso… só mais uma coisa o BD aonde ficam guardados as informações dos agendamentos, veio com o quartz.
Os agendamentos dos usuários ficam em outro BD, toda vez que um usuário insere um agendamento no banco eu agendo um processo relacionando com as configurações do usuário. Ai se alguém parar o tomcat ou a aplicação os agendamentos são gravados no BD do quartz(uma funcionalidade do quartz).

Chamando este método ele acessa o BD do quartz e reagenda tudo?

E mais uma dúvida como eu coloco uma trigger para rodar diariamente começando em um determinado horário e sendo finalizada em um outro horário ou no próximo dia?
Dei uma olhada na CronTrigger, mas acho que ela não resolve o meu problema, ou eu que não soube fazer a expressão… :?

Chamando esse método ele atualiza a memória do quartz e reagenda sim… Na verdade, com esse método vc informa uma nova trigger que será utitlizada no lugar da trigger com o agendamento anterior. Olha a API:

rescheduleJob(String triggerName, String groupName, Trigger newTrigger)
Remove (delete) the Trigger with the given name, and store the new given one - which must be associated with the same job (the new trigger must have the job name & group specified) - however, the new trigger need not have the same name as the old trigger.

Nunca fiz isso. :? Se eu descobrir algo te aviso.

Bom tentei de tudo quanto é maneira fazer o meu Job para de rodar através da trigger, a única solução que eu pensei para solucionar isso é o meu próprio job ficar verificando o tempo se chegar no tempo determinado ele mesmo se mata.
Agora alguém saberia como matar o Job? hehehhhe

Pra matar é só dar um sched.shutdown();

Mas ai eu não mataria todo o meu scheduler? Ou seja, eu não iria perder todos os meus outros processos agendados?

Sim, verdade! Que tal tentar então:

trigger.setEndTime(java.util.Date endTime)
“Set the time at which the SimpleTrigger should quit repeating (and be automatically deleted).”

Pelo que entendi, vc vai ter a data/hora que ele deve parar. O que acha? Pode ser que dê certo, porque a trigger não tem um método shutdown.

Eu também tinha entendido isso, mas quando fui usar não funcionou, então, postei o meu problema no fórum do quartz e em uma das respostas que eu tive foi esta:

Estou pensando em usar InterruptableJob, vou dar uma pesquisada e se conseguir coloco a solução aqui.

Por favor! :slight_smile:
Fiquei curiosa! rs

Mais uma coisa você saberia “settar” um Job?