[RESOLVIDO] ActiveMQ + Spring (Configurar intervalo do Listener)

Boa Tarde Pessoal,

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

Alguém sabe se isso seria possível?

Obrigado pela atenção.

Por qual motivo você precisaria fazer isso?

Tem o método “setReceiveTimeout” mas não sei se é o que você precisa. Da uma lida na documentação: http://static.springsource.org/spring/docs/2.5.x/reference/jms.html

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.

Bom Dia Romarcio,

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=IAX]Bom Dia Romarcio,

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.

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

Bom Dia Pessoal,

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

Configuração do Listener Container da fila

	<bean id="jmsOutputListenerContainer" 
		class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory" />
		<property name="destination" ref="outputQueue" />
		<property name="messageListener" ref="jmsOutputConsumer" />
		<property name="sessionTransacted" value="true" />
		<property name="autoStartup" value="false" />
	</bean>

Configuração do Scheduler

	<!-- Queue Jobs scheduler -->
	
	<!-- Scheduler factory bean configuration -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="startOutputQListenerContainerTrigger" />
			</list>
		</property>
	</bean>

	<!-- Jobs Beans -->
	<bean id="jobStartOutputQListenerContainer" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<!-- the spring bean jmsDlqConsumer was definied via annotation --> 
		<property name="targetObject" ref="jmsListenerContainerManager" />
		<property name="targetMethod" value="changeOutputContainerListenerStatus" />
	</bean>

	<!-- Job Triggers -->
	<bean id="startOutputQListenerContainerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail" ref="jobStartOutputQListenerContainer" />
		<property name="repeatInterval" value="3600000" />
	</bean>

Obrigado.