Messagerie JMS mise en œuvre
J'ai eu du mal avec ce "simple" tâche pour plus d'expirienced les gens, je suis bloquée depuis 2 jours maintenant besoin d'aide. J'ai changé les choses arround comme zillion de fois maintenant, enfin, je suis tombé sur ce printemps JMS tutoriel.
Ce que je veux faire, Envoyer un message et de le recevoir. J'ai été aussi la lecture de ce livre le chapitre 8 sur la messagerie. Il a vraiment bien explique 2 type de messagerie, et il y a bel exemple de l' publish-and-subscribe
type mais maintenant exemple pour point-to-point
de messagerie( c'est celui que j'ai besoin).
Je suis en mesure d'envoyer un message à la file d'attente sur mon propre, mais n'ont pas la moindre idée de comment recevoir c'est pourquoi j'ai essayé avec ce printemps tutoriel voici ce que j'ai obtenu jusqu'à présent :
RÉ-ÉDITÉ EXPÉDITEUR :
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;
}
});
}
}
RÉCEPTEUR :
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");
}
}
}
ré-édité 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>
Ne savais pas vraiment que la courbe d'apprentissage de ce est si long, je veux dire l'idée est très simple:
- Envoyer un message à la file d'attente de destination
- Recevoir de message de la file d'attente de destination
À recevoir des messages, vous effectuez les opérations suivantes(ne sorte de livre de le dire):
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.
Une fois que vous avez fait cela, des méthodes sur l'
MessageConsumer vous permettre de soit
requête de la Destination pour les messages ou
pour vous inscrire pour la notification des messages.
Quelqu'un peut-il svp me diriger vers la bonne direction, est-il un tutoriel qui vous explique en détails comment faire pour recevoir le message de la file d'attente?J'ai le travail envoyer un message code, n'est-ce pas le poster ici parce que ce post est trop long comme il est.
EDIT:
J'ai ajouté à mon jboss messaging destination-service.xml ce Mbean :
<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>
Eh bien, je voulais mettre en œuvre point à point, mais évidemment, je ne suis pas d'y arriver
Maintenant, vous semblez avoir un bean a appelé récepteur et un haricot appelé messageListener, les deux auditeurs 🙂
Et la file d'attente nom de l'Expéditeur, testQueue, ne semble pas être celui que vous êtes à l'écoute sur.
OK, j'ai mis à jour mon code appcontext.xml et de l'expéditeur .. mais encore, je reçois cette erreur :
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
Comment Exemple auditeur connaît de file d'attente pour les écouter, de toute façon, je n'ai pas préciser, ne sais pas comment.
OriginalL'auteur Gandalf StormCrow | 2010-03-22
Vous devez vous connecter pour publier un commentaire.
De Printemps URL exemple vous avez oublié:
Qui relie la file d'attente de l'auditeur 🙂
MODIFIER
Vous avez écrit dans les commentaires:
et
Le premier problème est je pense un nullPointerException sur la ligne
jmsTemplate.convertAndSend
. Votre jmsTemplate n'a pas été initialisé.Je crois que c'est parce que l'initialisation de la méthode n'est pas convertAndSend. Vous ne devriez pas besoin d'un init-method. Vous devez définir les propriétés dans la applicationcontext.xml, à propos de:
Qui devrait corriger les erreurs lors de l'envoi (BTW, pourquoi utilisez-vous JMSTemplate102 et pas JMSTemplate?).
L'autre question, vous configurer la file d'attente des noms en définissant des propriétés sur les haricots. Dans ce cas, vous semblez être à l'écoute des queueDestination file d'attente/ReceiverQueue que votre jmsContainer est configuré pour gérer les appels sur cette file d'attente par votre auditeur.
Où le diable n'est le messageListener bean défini dans le applicationcontext.xml?
si vous utilisez
ref="someName"
quelque part, il doit aussi être un<bean name="someName"
quelque part.MODIFIER
également jeter un oeil à cet exemple qui semble avoir un peu plus de code de configuration
expliqué. le pubSubDomain est false signifie que c'est le point-à-point 🙂
OriginalL'auteur extraneon