Javafree
Página Inicial do Fórum > Spring Framework

Configirar Spring Quartz dinamicamente



Criar novo tópico   Responder tópico


  1. romarcio
    Posts:421


    Comment Arrow

    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?
    _________________

    http://www.mballem.com/
    Desvendando o MongoDB, do Mongo Shell ao Java Driver - http://bit.ly/1HL8Rya



  1. davi.costa
    Posts:2520


    Comment Arrow

    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


    abcs
    _________________

    att Davi Costa
    Analista/Arquiteto Java
    Especialista em Engenharia de Sistemas
    ScrumMaster Certified



  1. romarcio
    Posts:421


    Comment Arrow

    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


    abcs



    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!

    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:

    _________________

    http://www.mballem.com/
    Desvendando o MongoDB, do Mongo Shell ao Java Driver - http://bit.ly/1HL8Rya



  1. davi.costa
    Posts:2520


    Comment Arrow

    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

    abcs
    _________________

    att Davi Costa
    Analista/Arquiteto Java
    Especialista em Engenharia de Sistemas
    ScrumMaster Certified



  1. romarcio
    Posts:421


    Comment Arrow

    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.
    Porém acho que o ideal era caçar na documentação do spring uma forma de usar quartz sem ser por xml

    abcs



    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.
    _________________

    http://www.mballem.com/
    Desvendando o MongoDB, do Mongo Shell ao Java Driver - http://bit.ly/1HL8Rya



  1. davi.costa
    Posts:2520


    Comment Arrow

    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.

    abcs
    _________________

    att Davi Costa
    Analista/Arquiteto Java
    Especialista em Engenharia de Sistemas
    ScrumMaster Certified



  1. romarcio
    Posts:421


    Comment Arrow

    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.

    abcs



    Na inicialização da aplicação que é lançada a exceção.


    _________________

    http://www.mballem.com/
    Desvendando o MongoDB, do Mongo Shell ao Java Driver - http://bit.ly/1HL8Rya



  1. romarcio
    Posts:421


    Comment Arrow

    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.
    _________________

    http://www.mballem.com/
    Desvendando o MongoDB, do Mongo Shell ao Java Driver - http://bit.ly/1HL8Rya



  1. ElPsyCongroo
    Posts:1688


    Comment Arrow

    Publicado em: 30/05/2013 09:52:06

    [quote="romarcio"]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.



    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.
    _________________

    Programador Java

    I´m a mad scientist.

    Tag CODE:
    http://javafree.uol.com.br/topic-870315-Tag-CODE-do-forum.html



  1. romarcio
    Posts:421


    Comment Arrow

    Publicado em: 30/05/2013 13:02:15

    [quote="ElPsyCongroo"][quote="romarcio"]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.



    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.



    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.
    _________________

    http://www.mballem.com/
    Desvendando o MongoDB, do Mongo Shell ao Java Driver - http://bit.ly/1HL8Rya



  1. davi.costa
    Posts:2520


    Comment Arrow

    Publicado em: 30/05/2013 21:15:45

    [quote="romarcio"][quote="ElPsyCongroo"][quote="romarcio"]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.



    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.



    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.



    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.

    abcs
    _________________

    att Davi Costa
    Analista/Arquiteto Java
    Especialista em Engenharia de Sistemas
    ScrumMaster Certified



  1. romarcio
    Posts:421


    Comment Arrow

    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.

    Valeu pelas dicas.
    _________________

    http://www.mballem.com/
    Desvendando o MongoDB, do Mongo Shell ao Java Driver - http://bit.ly/1HL8Rya



  1. ElPsyCongroo
    Posts:1688


    Comment Arrow

    Publicado em: 30/05/2013 22:55:46

    [quote="romarcio"][quote="ElPsyCongroo"][quote="romarcio"]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.



    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.



    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.



    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:



    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):

    http://forum.springsource.org/showthread.php?65196-quartz-cronExpression-from-database


    _________________

    Programador Java

    I´m a mad scientist.

    Tag CODE:
    http://javafree.uol.com.br/topic-870315-Tag-CODE-do-forum.html



  1. romarcio
    Posts:421


    Comment Arrow

    Publicado em: 30/05/2013 23:12:31

    @ElPsyCongroo
    Interessante esse 2° link que você postou. Acho que dessa forma eu não cheguei a testar.
    Assim que puder vou fazer uns testes.

    Valeu!
    _________________

    http://www.mballem.com/
    Desvendando o MongoDB, do Mongo Shell ao Java Driver - http://bit.ly/1HL8Rya



  1. Relacionados