2010-03-22 33 views
5

Daha fazla tecrübeli insanlar için bu "basit" görevle uğraşıyorum, 2 gün boyunca sıkışıp kaldım, yardıma ihtiyacım var. Şimdi zillion zamanları gibi şeyler değişti, sonunda ben this spring JMS tutorial tökezledim.JMS mesajlaşma uygulaması

Ne yapmak istiyorum, Mesaj yolla ve al. Mesajlaşma konusunda da this book bölüm 8'i okudum. Gerçekten 2 tip mesajlaşmayı açıklıyor ve publish-and-subscribe tipi için güzel bir örnek var ama şimdi point-to-point mesajlaşması için örnek (bu,'a ihtiyacım olan). Kendi başıma sıraya mesaj göndermek mümkün değilim, ama buradan nasıl bu bahar öğretici ile çalıştı bu nedenle sayfa almak için bir ipucu yok

Ben şimdiye kadar ne var ise:

YENİDEN dÜZENLENMİŞ SENDER:

package quartz.spring.com.example; 

import java.util.HashMap; 
import java.util.Map; 

import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.Queue; 
import javax.jms.Session; 

import org.springframework.jms.core.MessageCreator; 
import org.springframework.jms.core.JmsTemplate; 
import org.springframework.jms.core.JmsTemplate102; 
import org.springframework.jms.core.MessagePostProcessor; 

public class JmsQueueSender { 

    private JmsTemplate jmsTemplate; 
    private Destination destination; 

    public void setConnectionFactory(ConnectionFactory cf) { 
     this.jmsTemplate = new JmsTemplate102(cf, false); 
    } 

    public void setQueue(Queue queue) { 
     this.destination = queue; 
    } 

    public void simpleSend() { 
     this.jmsTemplate.send(this.destination, new MessageCreator() { 
      public Message createMessage(Session session) throws JMSException { 
       return session.createTextMessage("hello queue world"); 
      } 
     }); 
    } 

    public void sendWithConversion() { 
     Map map = new HashMap(); 
     map.put("Name", "Mark"); 
     map.put("Age", new Integer(47)); 
     jmsTemplate.convertAndSend("ReceiverQueue", map, new MessagePostProcessor() { 
      public Message postProcessMessage(Message message) throws JMSException { 
       message.setIntProperty("AccountID", 1234); 
       message.setJMSCorrelationID("123-00001"); 
       return message; 
      } 
     }); 
    } 
} 

ALICI:

package quartz.spring.com.example; 

import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.TextMessage; 

public class ExampleListener implements MessageListener { 

    public void onMessage(Message message) { 
     if (message instanceof TextMessage) { 
      try { 
       System.out.println(((TextMessage) message).getText()); 
      } 
      catch (JMSException ex) { 
       throw new RuntimeException(ex); 
      } 
     } 
     else { 
      throw new IllegalArgumentException("Message must be of type TextMessage"); 
     } 
    } 
} 

yeniden düzenlenmiş applicationContext.xml

 <?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:jee="http://www.springframework.org/schema/jee" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"> 

    <bean id="sender" class="quartz.spring.com.example.JmsQueueSender" 
     init-method="sendWithConversion" /> 
    <bean id="receiver" class="quartz.spring.com.example.ExampleListener"> 
    </bean> 

    <bean id="jmsContainer" 
     class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="connectionFactory" /> 
     <property name="destination" ref="queueDestination" /> 
     <property name="messageListener" ref="messageListener" /> 
    </bean> 

    <!-- Queue configuration --> 
    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> 
     <property name="environment"> 
      <props> 
       <prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop> 
       <prop key="java.naming.provider.url">jnp://localhost:1099</prop> 
       <prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop> 
       <prop key="java.naming.security.principal">admin</prop> 
       <prop key="java.naming.security.credentials">admin</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiTemplate" ref="jndiTemplate" /> 
     <property name="jndiName" value="ConnectionFactory" /> 
    </bean> 

    <bean id="queueDestination" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiTemplate" ref="jndiTemplate" /> 
     <property name="jndiName"> 
      <value>queue/ReceiverQueue</value> 
     </property> 
    </bean> 
</beans> 

gerçekten değil mi bunun için öğrenme eğrisi çok uzun olduğunu biliyoruz, bu fikrin çok basit demek: Hedef kuyruğuna için

  1. Mesaj gönder
  2. Eğeraşağıdakileri yapın, iletileri almak için hedef sıra

mesajı alma(yani kitap yazıyor): Bunu yaptıktan sonra

1 Locate a ConnectionFactory, typically using JNDI. 
2 Use the ConnectionFactory to create a Connection. 
3 Use the Connection to create a Session. 
4 Locate a Destination, typically using JNDI. 
5 Use the Session to create a MessageConsumer for that Destination. 

, MessageConsumer üzerinde yöntemleri mesajı bildirimi için kayıt size ya sorgu mesajları için Hedef veya sağlar.

birileri doğru yönde doğru gideceğimi tarif edebilir, sıradan iletisi nasıl ayrıntılarda açıklayan bir öğretici var mı? Bu yazı çok olduğu için çalışma burada yazılan vermedi, mesaj kodu göndermek zorunda olduğu gibi. DÜZENLEME:

jboss mesajlaşma hedef servisime ekledim.xml bu MBean: unuttuğunuz sizin Bahar örnek URL'den

<mbean code="org.jboss.jms.server.destination.QueueService" 
    name="jboss.messaging.destination:service=Queue,name=ReceiverQueue" 
    xmbean-dd="xmdesc/Queue-xmbean.xml"> 
    <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends> 
    <depends>jboss.messaging:service=PostOffice</depends> 
    </mbean> 
+0

PTP mesajlaşma yaptığınızı sanıyordum, ancak bu yaptığınız zaman uyumsuz mesajlaşmadır. –

+0

Peki ben nokta noktası uygulamak istedim ama tabii ki ben orada alıyorum değil –

+0

Şu anda alıcı ve fasulye denilen bir fasulye, her iki dinleyici messageListener adında bir fasulye var gibi görünüyor :) – extraneon

cevap

3

:

dinleyici :) Sen yazdı

DÜZENLEME için sıraya bağlayan

<!-- and this is the message listener container --> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory"/> <property name="destination" ref="destination"/> <property name="messageListener" ref="messageListener" /> </bean> 

yorumlar:

but still I'm getting this error : org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sender' defined in ServletContext resource [/WEB-INF/conf/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException 

ve

How does Example listener knows which queue to listen to anyways, I didn't specify to it, didn't know how 

ilk sorun ben çizgi jmsTemplate.convertAndSend bir NullPointerException düşünüyorum. JmsTemplate'iniz başlatılmamış.

Bunun init-method convertAndSend olmadığı için inanıyorum. Bir init yöntemine hiç gerek yok. Sen bu kadar, applicationContext.xml özellikleri ayarlayın olmalıdır: gönderilirken

<bean id="sender" class="quartz.spring.com.example.JmsQueueSender"> 
    <property name="queue" value="theNameOfYourQueue"> <!-- or in stead of value ref to a String which contains the shared queue name --> 
    <property name="connectionFactory" ref="connectionFactory"/> 
</bean> 

hataları düzeltmek gerekir Yani (eğer JMSTemplate102 olup JMSTemplate kullanırım neden BTW?).

Diğer soru, siz , fasulye üzerindeki özellikleri ayarlayarak sıra adlarını yapılandırın. Bu durumda, jmsContainer sizin dinleyiciniz tarafından o sıradaki çağrıları işlemek üzere yapılandırıldığı sırada kuyruk Kuyruk Sırası/ReceiverQueue öğelerini dinliyor görünüyorsunuz.

Buradaki heck, applicationcontext.xml dosyasında tanımlanan messageListener bean'idir?

ref="someName" bir yere kullanırsanız, bir yerlerde <bean name="someName" da olmalıdır.

DÜZENLEME da açıkladı biraz daha yapılandırma koduna sahip görünüyor this example de bakabilirsiniz. pubSubDomain false demektir, bu noktadan noktaya gelinir.

+0

@extraneon Görünüşe göre sadece unutulmamış bir şey var, eklenecek daha çok şey var, göndericimi güncelledim, appcontext ve mbean'ı hedef servise ekledim –