Spring + JMS = Help :D

Amigos, estou precisando fazer uma aplicação minha utilizar JMS…

O basico com um receiver eu ja consegui… porem eu preciso ter mais de um receiver e cada um “escutando” uma determinada fila… alguem pode me ajudar??

segue o que eu fiz para um receiver apenas

	<amq:broker useJmx="false" persistent="false">
		<amq:transportConnectors>
			<amq:transportConnector uri="tcp://localhost:0" />
		</amq:transportConnectors>
    </amq:broker>
    

  <bean id="defaultQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="defaultQueue"/>
  </bean>
  
  <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
    <property name="brokerURL" value="vm://localhost"/>
  </bean>
  
  <bean id="listenerContainer" class="org.springframework.jms.listener.SimpleMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="destination" ref="defaultQueue"/>
    <property name="messageListener">
     <bean class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
          <property name="delegate">
               <bean class="br.com.dnasolution.integrabrasil.ws.jms.MessageListenerImpl"/>
          </property>
     </bean>
    </property>
  </bean>
  
  <!-- This one is to send test messages -->
  <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="defaultDestination" ref="defaultQueue"/>
  </bean>

Receiver[code]
@Component
public class MessageListenerImpl implements MessageListener{

@Override
public void onMessage(Message message) {
	System.out.println("RECEIVER");
	  TextMessage msg = (TextMessage) message;
	  Calendar dataEntradaComparar = Calendar.getInstance();
	  dataEntradaComparar.add(Calendar.MINUTE, 1);
	  while(Calendar.getInstance().getTimeInMillis() < dataEntradaComparar.getTimeInMillis()){

	  }
	  
	  try
	  {
	   System.out.println("MESSAGE: " + msg.getText());
	  }
	  catch (JMSException e)
	  {
	   e.printStackTrace();
	  }
}

}[/code]

e o sender[code]
@Component
public class MessageProducer
{

@Autowired
private JmsTemplate jmsTemplate;

private String mensagem;
public void sendMessages(String msg) throws JMSException
{
mensagem = msg;
System.out.println(“PRODUCER”);
MessageCreator messageCreator = new MessageCreator()
{
public Message createMessage(Session session) throws JMSException
{
TextMessage message = session.createTextMessage(mensagem);
return message;
}
};
jmsTemplate.send(messageCreator);
}
}

[/code]

Estou usando Spring + Tomcat + activeMq

obrigado

Acho que isso pode te ajudar:

[code]<?xml version="1.0" encoding="UTF-8"?>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
	<property name="connectionFactory" ref="pooledConnectionFactory" />
</bean>

<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
	<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
	<property name="brokerURL" value="${URL_ACTIVEMQ}" />
</bean>

<jms:listener-container 
	connection-factory="pooledConnectionFactory"
	concurrency="10-20"
	prefetch="1"
	acknowledge="auto">
	<jms:listener destination="fila1" ref="fila1MessageListener" />
	<jms:listener destination="fila2" ref="fila2MessageListener" />
</jms:listener-container>
[/code]

fila1MessageListener e fila2MessageListener devem implementar javax.jms.MessageListener

nesta configuracao vc consegue configurar listeners para varios destinations e consegue determinar a quantidade de consumidores para as filas

espero ter ajudado

abs

PS: Também uso Spring + Tomcat + activeMQ

showwww. agora para finalizar… eu posso enviar mais de um dado? por exemplo uma String e um List ??

valeu

Para conseguir enviar mais uma informacao vc deve usar mapmessage ou objectmessage, eu prefiro mapmessage

Entao eu estou fazendo isso:

[code] MessageCreator messageCreator = new MessageCreator()
{
public MapMessage createMessage(Session session) throws JMSException
{
List listaFirmas = new ArrayList();
TbIndiceNtFirmasWS indice1 = new TbIndiceNtFirmasWS();
indice1.setCdCartorioCnj(“11.021-3”);
indice1.setCdComunicadoInformarCartorio(1);
indice1.setCdFicha(2);
indice1.setDtAberturaFirma(“10/10/20140”);
indice1.setDtApontamentoIndice(“11/11/2011”);
indice1.setDtAto(“03/09/2009”);
indice1.setDtAtualizacaoIndice(“08/08/2008”);
indice1.setDtExportacaoLote(“07/07/2007”);
indice1.setNmParte(“Fabio”);
indice1.setNmQualificacaoParte(“Qualificacao”);
indice1.setNrCartaoAssinatura(“aaaa”);
indice1.setNrDocumentoParte(“documento”);
indice1.setNrPapelSeguranca(“asasd”);
indice1.setNrSelo(“selo”);
indice1.setSgSexoParte(“M”);
indice1.setTpDocumentoParte(“Tipo”);
listaFirmas.add(indice1);

			MapMessage m = session.createMapMessage();
			m.setString("nrCartorioCnj", "nrCartorioCnj");
			m.setObject("listaFirmas", listaFirmas);
		    //TextMessage message = session.createTextMessage("ae");
		    return m;
		   }
		  };
		  
		  jmsTemplate.send(messageCreator);[/code]

porem recebo o seguinte erro:

[quote]Exception in thread “main” javax.xml.ws.soap.SOAPFaultException: java.io.IOException: Object is not a primitive: br.com.dnasolution.integrabrasil.util.ws.TbIndiceNtFirmasWS@31b95f
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:111)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
at $Proxy30.addIndiceNtFirmas(Unknown Source)
at testefirmas.Main.main(Main.java:64)[/quote]

Outra coisa… como eu falo para qual lista eu quyero mandar???

jmsTemplate.send(“fila1”, msg)?