Spring + JMS = Help :D

6 respostas
fabioebner

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
@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();
		  }
	}

	
}
e o sender
@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);
 }
}

Estou usando Spring + Tomcat + activeMq

obrigado

6 Respostas

jpjcjbr

Acho que isso pode te ajudar:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core"
	xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:jms="http://www.springframework.org/schema/jms"	
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
						http://www.springframework.org/schema/aop
						http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
						http://www.springframework.org/schema/context 
						http://www.springframework.org/schema/context/spring-context-2.5.xsd
						http://www.springframework.org/schema/jee 
						http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
						http://www.springframework.org/schema/tx
						http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
						http://www.springframework.org/schema/util 
						http://www.springframework.org/schema/util/spring-util-2.5.xsd
						http://cxf.apache.org/core
				        http://cxf.apache.org/schemas/core.xsd
						http://cxf.apache.org/jaxws 
						http://cxf.apache.org/schemas/jaxws.xsd
						http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd"
	default-autowire="byName">
	
 	<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>
</beans>

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

jpjcjbr

PS: Também uso Spring + Tomcat + activeMQ

fabioebner

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

valeu

jpjcjbr

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

fabioebner

Entao eu estou fazendo isso:

MessageCreator messageCreator = new MessageCreator()
			  {
			   public MapMessage createMessage(Session session) throws JMSException
			   {
				   List<TbIndiceNtFirmasWS> listaFirmas = new ArrayList<TbIndiceNtFirmasWS>();
		            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);

porem recebo o seguinte erro:

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

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

jmsTemplate.send(“fila1”, msg)?

Criado 2 de agosto de 2011
Ultima resposta 2 de ago. de 2011
Respostas 6
Participantes 2