Quartz, Dúvidas!!!
14/08/2010 00:00
0
Olá pessoal,

Estou com um problema quanto à utilização do Quartz com grails. Vou tentar explicar...

Tenho o seguinte cenário: Uma aplicação, que necessita executar uma rotina de tempos em tempos. O intervalo com que essa rotina executará, deverá ser especificado pelo usuário (através de uma GUI qualquer ele informa o intervalo em dias).

Consegui fazer executar a rotina de tempos em tempos utilizando o Quartz. Porém, não estou conseguindo programar essa configuração dinâmica do intervalo.

Estou fazendo da seguinte forma: Quando o usuário informa o periodo, No meu controlador, calculo o dia da próxima execução com a quantidade de dias do intervalo especificado e Agendo esta nova execução. Vejam o código:

class MyController {
.
.
.
def modifyPeriod = {
.
.
.

// faço o cálculo de quando será efeuado o job. E ajendo a execução com esta data
ApplicationJob.schedule(nextExecution, [type:NotificationType.AUTOMATIC])

.
.
}
}


No meu Job, faço o seguinte:


public class ApplicationJob {

def group = "MyGroup"

def execute(context) {
def notificationType = context.mergedJobDataMap.get('type')

if(notificationType) {
println "Job Executado ${notificationType}"

def date = new Date() // aki somo o dia de hoje com o intervalo
date.setDate(date.getDate() + Integer.parseInt(periodo)) // especificado pelo usuário
ApplicationJob.schedule(dateAux1, [type:NotificationType.AUTOMATIC]) // e Faço um novo agendamento

println "Job Agendado Novamente"
}
}
}


O problema que tenho quando faço desta maneira é o seguinte: Quando o usuário define o intervalo pela primeira vez, o agendamento ocorre normalmente e o job é executado corretamente, de tempos em tempos. Porém, se o usuário definir um próximo intervalo, um novo agendamento é feito, e o anterior ainda está sendo executado. Ou seja, agora tenho "duas Linhas" sendo executadas. Se agendar um próximo intervalo, terei "3 linhas de execução", e assim por diante. Queria trabalhar somente com uma destas Linhas, e quando o usuário definir outro intervalo, eu apenas altere o agendamento desta linha.


Espero ter conseguido explicar. Obrigado.
Tags: Grails


0
Eu tentei de outra forma. Quando o usuário escolhe um novo intervalo para a repetição do Job, tentei utilizar: quartzScheduler.unscheduleJob('mySimpleTrigger', 'group') para cancelar os triggers e depois tentar escalonar uma nova tarefa, porém, o método unschedule() parece não funcionar. Alguém já fez algo do tipo, qualquer opnião é bem vinda.
15/08/2010 00:00


0
Eu acredito que o melhor que você pode fazer é criar um job para controlar o schedule dos outros jobs lendo o periodo do banco.
ex.:

Quando o usuario definir o periodo, vc persiste no banco para aquele job a prox data de execucao. esse outro job de contrle vai rodar todo dia e ver os jobs que existem para ser executados no dia.
Aí ele executa e atualiza a data no banco para a nova execucao.
Se o usuário mudar a data a mesma será modificada no banco fazendo com que só haja 1 linha de execucao para cada job sempre.
16/08/2010 00:00


0
Valew pela dica,

Vou tentar assim.
16/08/2010 00:00



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto