Executar evento em tempo agendado
13/03/2015 12:20
1
Ola Pessoal!

Tenho uma aplicação e estou implementado um módulo semelhante a um agendamento e precisava de saber se existe algum plugin ou estratégia para executar algum procedimento no tempo agendado?

Tentei usar o plugin quartz e ele funcionou desde que eu mandasse verificar de minuto a minuto, porém temo que o uso da memória pela quantidade de usuários se torne um problema a longo prazo.

Assim, se alguém conhece algum meio de efetuar um agendamento que não seja por este plugin por favor me comunique.

Obrigado.
Tags: agendamento, evento programado


1
Boa tarde Rodrigo.

Aqui no projeto, utilizamos o quartz e não precisamos verificar o tempo todo. Basta agendar um job que o mesmo iniciará automaticamente na hora agendada. Para isso, iniciamos o quartz no bootstrap da aplicação.

Importante também verificar se já existe um job com o mesmo nome, se após execução o mesmo deverá ser descartado ...


0
Leandro,

você poderia postar seu código para facilitar meu aprendizado?

Se não for pedir muito.
13/03/2015 15:32


3
Bom dia Rodrigo.

Segue código que utilizamos para execução de tarefas:

Injetar o quartzScheduler na sua classe service
Iniciando o quartz - quartzScheduler.start()
Agendando uma tarefa -

	/**
* Agenda tarefa
* @param nome Nome da tarefa
* @param data Data para execução
* @param closure Bloco de código para tarefa
* @return data do agendamento
*/
def agendaTarefa(nome, data, closure){
def jobDetail = ClosureJob.createJob(name:nome, closure)

def trigger = new SimpleTriggerImpl(nome, data)
trigger.repeatCount = 0
trigger.jobKey = jobDetail.key
log.debug "key ---- " + jobDetail.key
def dataAgendamento = quartzScheduler.scheduleJob(jobDetail, trigger)
log.debug "Primeiro agendamento realizado para ${dataAgendamento}"
dataAgendamento
}



Reagendando uma tarefa -

   /**
* Reagenda tarefa
* @param nome Nome da tarefa
* @param data Data para executar a tarefa
*/
def reagendaTarefa(nome, data){
def trigger = new SimpleTriggerImpl(nome, "default", data)
def jobkey = new JobKey(nome)
trigger.jobKey = jobkey
trigger.repeatCount = 0
def oldTrigger = quartzScheduler.getTriggersOfJob(jobkey)[0]
quartzScheduler.rescheduleJob(oldTrigger.key, trigger)
}


Cancelando uma tarefa

   /**
* Cancela tarefa
* @param nome Nome da tarefa
*/
def cancelaTarefa(nome){
def jobKey = new JobKey(nome)
quartzScheduler.deleteJob(jobKey)
}


Verificar se existe tarefa em execução

   /**
* Verifica se tarefa está em execução
* @param nome Nome da tarefa
* @return Estado da tarefa
*/
def verificaTarefa(nome){
def jobKey = new JobKey(nome)
def jobCtxs = quartzScheduler.getCurrentlyExecutingJobs()
def triggers = quartzScheduler.getTriggersOfJob(jobKey)
def tarefaEmExecucao = false
jobCtxs.each{ jobCtx ->
def jobName = jobCtx.jobDetail.name
if (jobName.equalsIgnoreCase(nome))
tarefaEmExecucao = true
}
if (tarefaEmExecucao)
TarefaEstado.EXECUTANDO
else if (triggers.size() > 0)
TarefaEstado.ESPERA
else
null

}


1
Leandro,

você me ajudou muito.

Agora estou vendo o poder desse plugin.

Muito obrigado pelo compartilhamento do código.

17/03/2015 09:02


1
Bom que foi útil para você. Vou te dizer que eh bem robusto. Termos uma rotina offline que executa direto e ao fim da mesma, reagenda para 10 minutos pra frente. Já roda há mais de 2 anos e às vezes ate esquecermos que existe.


0
Ola,
estou tentando usar este exemplo porém não está dando certo.
Uso o Grails 2.5.0 e adiciono o pluguin quartz:
compile ":quartz:1.0.2"

porém em agendaTarefa() na linha posterior, não consigo encontrar a Biblioteca ClosureJob para invocar o método "
ClosureJob.createJob()
".
Alguém conseguiu encontrar este método ou possuem outro meio de fazer o agendamento de tarefas?
Ouvi dizer que este plugin é muito robusto para agendamentos, porém não encontro em lugar nenhum um exemplo que funciona.
17/08/2015 21:09


0
Boa noite Ovidio.

Tente instalar o plugin do quartz 2, pois é a versão que utilizo.


0
Ola Leandro!

Obrigado por me ajudar!

inclui o plugin em minha app 

compile ":quartz2:2.1.6.2"


porém de todo jeito que tento compilar gera um erro muito estranho:

|Loading Grails 2.5.0
|Configuring classpath
.
|Environment set to development
.................................
|Packaging Grails application
....
|Compiling 183 source files
  [groovyc] org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
  [groovyc] Compile error during compilation with javac.
  [groovyc] D:\SysApp\target\work\plugins\quartz2-2.1.6.2\src\java\grails\plugin\quartz2\LocalDataSourceJobStore.java:103: error: <anonymous grails.plugin.quartz2.LocalDataSourceJobStore$1> is not abstract and does not override abstract method initialize() in ConnectionProvider
  [groovyc] new ConnectionProvider() {
  [groovyc]   ^
  [groovyc] D:\SysApp\target\work\plugins\quartz2-2.1.6.2\src\java\grails\plugin\quartz2\LocalDataSourceJobStore.java:120: error: <anonymous grails.plugin.quartz2.LocalDataSourceJobStore$2> is not abstract and does not override abstract method initialize() in ConnectionProvider
  [groovyc] new ConnectionProvider() {
  [groovyc]   ^
  [groovyc] Note: D:\SysApp\target\work\plugins\quartz2-2.1.6.2\src\java\grails\plugin\quartz2\LocalDataSourceJobStore.java uses unchecked or unsafe operations.
  [groovyc] Note: Recompile with -Xlint:unchecked for details.
  [groovyc] 2 errors
  [groovyc] 
  [groovyc] 
  [groovyc] 1 error
.Error 
|
Compilation error: startup failed:
Compile error during compilation with javac.
D:\SysApp\target\work\plugins\quartz2-2.1.6.2\src\java\grails\plugin\quartz2\LocalDataSourceJobStore.java:103: error: <anonymous grails.plugin.quartz2.LocalDataSourceJobStore$1> is not abstract and does not override abstract method initialize() in ConnectionProvider
new ConnectionProvider() {
^
D:\SysApp\target\work\plugins\quartz2-2.1.6.2\src\java\grails\plugin\quartz2\LocalDataSourceJobStore.java:120: error: <anonymous grails.plugin.quartz2.LocalDataSourceJobStore$2> is not abstract and does not override abstract method initialize() in ConnectionProvider
new ConnectionProvider() {
^
Note: D:\SysApp\target\work\plugins\quartz2-2.1.6.2\src\java\grails\plugin\quartz2\LocalDataSourceJobStore.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors
1 error
Process finished with exit code 1

Você usa esta versão do plugin??? Sabe como me ajudar a resolver este erro?
18/08/2015 10:33


0
Interessante este post.

Eu posso passar um service com parâmetros no lugar da Closure para ser agendada?
18/08/2015 10:59


0
Ovídio,

você deve estar colocando ambos plugins:

compile ":quartz2:2.1.6.2"
compile ":quartz:1.0.2"


e isso gera um erro.

retire o ":quartz:1.0.2" e deixa somente o ":quartz2:2.1.6.2"
18/08/2015 17:57


0
Ola Leabdro!

se nao for pedir muito poderia postar um exemplo de closure com parametros que usa para fazer os agendamentos.

Gostaria de saber como e feita uma closure e como ela e chamada e passada por parametro.

eu queria saber se e possivel passar um servico no lugar da closure, por exemplo netes agendamentos.

Obrigado  pela ajuda.
19/08/2015 00:31


1
Bom dia Márcio, no nosso caso, passamos como parâmetro uma clousure com o código a ser executado no momento em que chegar o horário agendado. O mecanismo de agendamendo é esse que está postado. Você só precisa passar o que será executado.

Com relação a como fazer uma clousure, sugido dar uma lida em http://www.groovy-lang.org/closures.html

Qualquer questão, é só postar !


0
Ola Leandro!

estou com uma dúvida. Eu coloquei a execução no JOB por exemplo ENVIAR EMAIL (Serviços, mensagens, tudo configurado no JOB) e estou passando via parâmetro apenas os dados para personalizar a mensagem (nome, conteúdo, valores, etc). 

Daí quando eu coloco null no lugar da Closure ocorre um erro. Eu não quero enviar o bloco de execução. Já coloquei meus serviços todos no JOB e gostaria de enviar apenas os parâmetros para efetuar a execução porém se eu não informar a Closure nos parâmetros dá erro dizendo que não pode ser nula.

Saberia me ajudar em como posso fazer para resolver isso?
20/08/2015 14:02


0
Boa tarde Márcio. Desculpe pela demora em responder, pois ando com bastante trabalho.

Utilizamos um mecanismo de controle para executar somente o que nos importa em cada rodada agendada. No seu caso, poderia criar um mecanismo para marcar os email enviados com sucesso, falha, etc. Daí a cada rodada agendada você enviaria os emails com base nessas regras definidas. 

Qualquer coisa, posta ái.



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