JMS обменивающаяся сообщениями реализация

Я боролся с этой "простой" задачей для более опытных людей, я застреваю в течение 2 дней, теперь нуждаются в помощи. Я изменил вещи в подобное огромное количество времен теперь, наконец я наткнулся на это пружинное учебное руководство JMS.

Что я хочу сделать, Отправьте сообщение и получите его. Я также читал эту книжную главу 8 по обмену сообщениями. Это действительно приятно объясняет 2 типа обмена сообщениями и существует хороший пример для publish-and-subscribe введите, но теперь пример для point-to-point обмен сообщениями (это - то, в котором я нуждаюсь).

Я могу отправить сообщение очереди самостоятельно, но не имею подсказки, как получить вот почему, я попробовал этим пружинным учебным руководством, вот то, что я имею до сих пор:

ПЕРЕИЗДАННЫЙ ОТПРАВИТЕЛЬ:

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

ПОЛУЧАТЕЛЬ:

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");
        }
    }
}

переизданный applicationcontext.xml

       
 

     
     
      

     
         
         
         
     

     
     
         
             
                org.jnp.interfaces.NamingContextFactory 
                jnp://localhost:1099 
                org.jboss.naming:org.jnp.interfaces 
                admin 
                admin 
             
         
     

     
         
         
     

     
         
         
            queue/ReceiverQueue 
         
     
 

Действительно не знал, что кривая обучения для этого является такой длинной, я подразумеваю, что идея очень проста:

  1. Отправьте сообщение целевой очереди
  2. Получите сообщение от целевой очереди

Для получения сообщений Вы делаете следующее (так заказывает, говорят):

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 позволяют Вам или запросить Место назначения для сообщений или зарегистрироваться для уведомления о сообщении.

Действительно ли кто-то может направить меня к правильному направлению, есть ли учебное руководство, которое объясняет в деталях, как получить сообщение от очереди? У меня есть работа, отправляют код сообщения, не отправил его здесь, потому что это сообщение является слишком длинным как естьПравить:

Я добавил к своему jboss обменивающийся сообщениями destination-service.xml этот Mbean:


     jboss.messaging:service=ServerPeer
     jboss.messaging:service=PostOffice
   

5
задан Mark B 22 March 2010 в 14:40
поделиться

1 ответ

Вы забыли URL из вашего примера Spring:

<!-- 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>

Который подключает очередь к слушателю :)

РЕДАКТИРОВАТЬ

Вы написали в комментариях :

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

и

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

Первая проблема - это исключение nullPointerException в строке jmsTemplate.convertAndSend . Ваш jmsTemplate не был инициализирован.

Я считаю, что это потому, что метод init не convertAndSend. Вам вообще не нужен init-метод. Вы должны установить свойства в applicationcontext.xml примерно так:

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

Это должно исправить ошибки при отправке (Кстати, почему вы используете JMSTemplate102, а не JMSTemplate?).

Другой вопрос: вы настраиваете имена очередей, задавая свойства bean-компонентов. В этом случае вы, кажется, слушаете очередь queueDestination / ReceiverQueue, поскольку ваш jmsContainer настроен для обработки вызовов в этой очереди вашим слушателем.

Где, черт возьми, был bean-компонент messageListener, определенный в applicationcontext.xml?

если вы используете ref = "someName" , где-то также должен быть где-то.

РЕДАКТИРОВАТЬ

также посмотрите этот пример , который, кажется, имеет немного больше объяснения кода конфигурации . pubSubDomain имеет значение false, значит, это точка-точка :)

3
ответ дан 15 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: