Tenho uma aplicação utilizando ActiveMQ com Spring, então tenho alguns listeners configurados, gostaria de saber se existe um modo para configurar o ActiveMQ ou o Listener para consumir as mensagens de tempos em tempos (pré-configurados).
Uma forma seria usar um agendador de tarefas (TimeTask ou Quartz), para a cada 5, 10 ou 20 minutos ativar o consumo. Depois de consumir da um close e volta a espera. Teria que implementar na aplicação cliente.
Ou ainda, na aplicação produtor, armazenar as ,mensagens em uma lista e cada tanto tempo, envia-las e então o consumidos as consome.
Obrigado pela ajuda. Na verdade a sua ultima sugestao seria a ideal, foi nisso que pensei, mas como configurar o produtor ou a fila para enviar a mensagem para o Listener em periodos programados: E isto que estou investigando.
Obrigado pela ajuda. Na verdade a sua ultima sugestao seria a ideal, foi nisso que pensei, mas como configurar o produtor ou a fila para enviar a mensagem para o Listener em periodos programados: E isto que estou investigando.
Caso alguem tenha ideia de como fazer.
Obrigado.
[/quote]
Nesse caso, seria melhor usar o esquema no consumidor. Porém acho que você não poderá usar o JMS disponibilizado pelo Spring para consumir as mensagens, porque o JMSTemplate fica todo o tempo escutando a fila.
Teria que implementar um classe consumidora na mão e então usar um agendador de tarefas para chamar o método consumidor a cada tantos minutos, horas ou segundos. Esse agendados pode ser controlado pelo Spring.
[quote=IAX]Entendo, o que me deixa intrigado e fato de funcionalidade como essa nao estar implementada em nenhum do lados (Produtor/Listener) da framework.
Enfim, muito obrigado pela ajuda, vou continuar dando uma olhada, mas a opcao que vc me deu e boa…
[/quote]
É que teoricamente o ouvinte deve capturar todas as mensagens que estão na fila, logo que elas chegam ou logo que ele estiver ativo, então não teria porque setar um tempo para ele consultar a fila. Não tem muito sentido nisso.
Consegui resolver meu problema da seguinte forma, como estou utilizando Spring ficou mais fácil. Para a minha fila em questão, configurei um ListenerContainer pelo Spring sendo que esse Container é instanciado mas não inicializado, ou seja não consome as mensagens. O segundo passo foi criar um Scheduler que altera o status do meu container (ou seja inicia ou pára) nesse Scheduler do Spring posso configurar qualquer tipo de lógica de agendamento, utilizando dessa forma consigo aproveitar o Transaction Manager no consumo e entrega das mensagens. No caso configurado abaixo, as mensagens serao consumidas de hora em hora, a cada 3600000 milisegundos. Abaixo seguem as configurações para ficar mais claro.
Pessoal muito obrigado e espero que a solução que encontrei ajude alguém, embora possam haver outras mais elegantes, essa me serviu como luva devido ao controle das duas partes (agendamento e gerência de transação).