Configirar Spring Quartz dinamicamente - Javafree: O fórum de Java que mais cresce
Configirar Spring Quartz dinamicamente
Publicado em: 28/05/2013 14:20:44
Como posso configurar o Quartz usando o Spring de forma dinâmica, ou seja, durante a execução de uma tarefa e preciso criar uma nova tarefa informando um novo agendamento.
Consegui agendar e executar a 1ª tarefa, mas não estou sabendo criar a 2ª tarefa de forma dinâmica. Tem alguma modo de fazer isso?
Publicado em: 28/05/2013 15:16:08
mostra o código de como realizou a primeira tarefa, com ctza vai ficar mais fácil para a comunidade te ajudar
Publicado em: 28/05/2013 15:53:28
[quote="davi.costa"]mostra o código de como realizou a primeira tarefa, com ctza vai ficar mais fácil para a comunidade te ajudar
Meu problema é o seguinte, quando eu configuro a 2ª tarefa no Spring, eu precisaria configurar ela sem nenhuma data ou tempo de execução.
Porque eu só quero que ela comece a ser executada após a 1ª tarefa ser executada e me retornar um horário especifico.
No caso, por exemplo, a propriedade cronExpression eu precisaria deixar sem valor nenhum e adicionar esse valor através do código java quando tal valor existir após a execução da 1ª tarefa.
Porém, se eu inicializo o Spring sem essa propriedade com um valor setado, ele lança uma exceção. Esse é o meu problema!
<bean id="cronTriggerSendEmailSchedule" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="mySendEmailSchedule"/> <property name="cronExpression" value="0/10 * * * * ?"/> </bean>
O contexto é o seguinte. Tenho um site com tarefas agendadas. Em um certo horário do dia eu faço uma pesquisa no banco para ver quais tarefas devem ser publicadas em um portal. Então essa pesquisa está sendo feita como 1ª tarefa usando o quartz. Porém se a pesquisa me retorna que existe conteúdo a ser publicado, eu devo pegar o horário em que ele será publicado neste dia e agendar uma 2ª tarefa com o quartz, passando o horário de publicação como parâmetro. Dai nesse horário a 2ª tarefa publica no portal e também envia um e-mail para os usuários inscritos neste portal.
Agora, repetindo, meu problema é com esse tempo inicial que o Spring exige que eu coloque na configuração do CronTriggerBean referente a 2ª tarefa. Tem algum mode de configurar sem usar a propriedade cronExpression?
O spring lança essa exception sem um tempo inicial de agendamento:
Caused by: org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.
Publicado em: 28/05/2013 16:07:15
se vc tiver os jars do quartz na sua app, vc pode criar na classe java mesmo.
Porém acho que o ideal era caçar na documentação do spring uma forma de usar quartz sem ser por xml
Publicado em: 28/05/2013 16:19:33
[quote="davi.costa"]se vc tiver os jars do quartz na sua app, vc pode criar na classe java mesmo.
Já fiz isso, criei o bean por código e substitui pelo xml. Porém, segue com o mesmo problema.
por código eu tenho o método setCronExpression() e se eu não passar o valor na inicialização lança a mesma exceção.
Estou achando que isso que pensei em fazer não rola com o quartz. Acho que vou tentar com TimerTaske ver o que acontece.
Publicado em: 28/05/2013 22:31:04
Na inicialização da aplicação, ou quando vc chama pela classe? Pq é só vc programar p startar na classe quando vc receber os parametros que quer passar e monta a String.
Publicado em: 28/05/2013 22:45:47
[quote="davi.costa"]Na inicialização da aplicação, ou quando vc chama pela classe? Pq é só vc programar p startar na classe quando vc receber os parametros que quer passar e monta a String.
Na inicialização da aplicação que é lançada a exceção.
Publicado em: 29/05/2013 12:26:03
Acabei resolvendo da seguinte forma:
A 1ª tarefa eu configuro pelo spring-quartz;
A 2ª tarefa eu configuro pelo timertask puro, sem usar a configuração pelo spring.
Não era bem como eu queria, mas no momento foi o que deu pra fazer.
Publicado em: 30/05/2013 09:52:06
[quote="romarcio"]Acabei resolvendo da seguinte forma:
Estranho, eu uso o Quartz para agendamento de tarefas, e quando uma tarefa é executada dentro de um Job, consigo agendar outra, de forma encadeada. Dentro do meu Job, vejo se uma condição foi realizada, se for eu agendo para horário X, senão para horário Y.
Usar TimerTask com Quartz não é muito legal.
Publicado em: 30/05/2013 13:02:15
[quote="ElPsyCongroo"][quote="romarcio"]Acabei resolvendo da seguinte forma:
Não estou mais usando o timer task e sim o quartz, até porque o quartz me oferece a opção de adicionar uma lista de agendamentos que é o que eu preciso.
Mas não consegui fazer tudo pelo Spring. A 2ª tarefa, que é a que pode conter uma lista de agendamentos para um mesmo dia, eu fiz a partir do código nativo do quartz, sem usar o gerenciamento do Spring. Segundo os testes que fiz está funcionando ok, mas tudo pelo Spring não consegui fazer.
Publicado em: 30/05/2013 21:15:45
[quote="romarcio"][quote="ElPsyCongroo"][quote="romarcio"]Acabei resolvendo da seguinte forma:
De repente até tenha alguma opção via Spring, sem usar xml, tipo anotações ou código mesmo, porém teríamos que pesquisar na documentação, ai vai depender de versões do Spring e Quartz que vc tá usando. Tenta dar uma olhada nisso.
Publicado em: 30/05/2013 21:51:40
@davi.costa
Já dei uma procurada, mas não encontrei nada como eu queria. Não sei se deixei passar alguma coisa despercebida, mas no momento vou deixar como está. Ta funcionando certinho da maneira como fiz.
Publicado em: 30/05/2013 22:55:46
hum... entendi. É mais complicado do que parece. Para que o bean funcione, a propriedade cronExpression é obrigatória.
Pesquisando, vi que o pessoal estende a classe CronTriggerBean, para alterar o setter do atributo cronExpression:
public class ConfigurableCronTriggerBean extends CronTriggerBean { private static List<String> cronSchedules = new ArrayList<String>(); public void setCronExpression(CronExpression cronExpression) { CronExpression expression = null; cronSchedules = getSchedules(); for (String cronExp : cronSchedules) { try { expression = new CronExpression(cronExp); } catch (ParseException e) { e.printStackTrace(); } super.setCronExpression(expression); } } private List<String> getSchedules() { fileSchedulerDao = new FileSchedulerDaoImpl(); returnfileSchedulerDao.getScheduleList(); }
De: http://forum.springsource.org/archive/index.php/t-65196.html
Mesmo assim, ele consulta do banco e seta. Não tem nada parecido em configurar depois que um Job é executado. Dá para fazer uns testes com o ConfigurableCronTriggerBean para que ele aceite NULL e, durante a execução do primeiro Job, obter ele dinamicamente e re-escalonar (rescheduleJob):