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

6 respostas
I

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.

6 Respostas

R

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.

I

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.

R

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.

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.

I

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…

R

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…

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

I

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.

Criado 8 de março de 2012
Ultima resposta 14 de mar. de 2012
Respostas 6
Participantes 2