Я боролся с этой "простой" задачей для более опытных людей, я застреваю в течение 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 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
Вы забыли 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, значит, это точка-точка :)