2013-12-09 2 views
0

У меня есть клиент в java, который отправляет сообщение jms в очередь («queue-request»). Сообщение содержит свойство int («id»), содержащее уникальный идентификатор клиента. Сообщение обрабатывается и помещается в другую очередь («queue-reply»). Как клиент может ждать, пока сообщение с его идентификатором окажется в очереди, а затем прочитайте его. Я попытался использовать прослушиватель и реализовать onMessage, но как я могу прекратить прослушивание, когда сообщение получено?читать сообщение jms из очереди с помощью selector

ответ

1

JMS синхронный можно использовать, используя JMSReplyTo. Создайте очередь очереди при отправке оригинального сообщения с тем же сеансом. Начало Слушайте очередь темпа и установите исходное сообщение JMSReplyTo TmpQueue.

Использование TempQueue Receiver.receive(), чтобы сделать ожидание нити (синхронно)

Полный пример кода можно найти в

http://jmsexample.zcage.com/

+0

и как это решение будет выглядеть без временных очередей, но только на том, что слушают все клиенты? – benst

+0

, так что я ищу, как асинхронно вытащить сообщение, предназначенное для клиента из одной большой очереди. Но это отлично работает для синхронного обмена сообщениями. проголосовали за победу – benst

+1

JMS разработан специально для Asyc, он не обеспечивает синхронизацию как встроенную функцию. Вы можете выполнить sycn с помощью JMSReplyTo. Если вы используете назначение в качестве очереди, которое прослушивается n номером клиента, тогда сообщение не будет доставлено всем слушателем очереди. Поэтому для JMSReplyTo вам нужно использовать только «тему». И в клиенте используйте подписчика для получения сообщения и проверки идентификатора. Некоторая вещь как Хотя (true) { Сообщение сообщение = .. получать Сообщение из темы using .receive() Если message.getText(). Equals (id) { Break; } } – Mani

0

В JMS необходимо указать слушателя для очереди так что если сообщение отправлено, то конкретный прослушиватель выбирается для приема сообщения. Весной вы можете указать слушателя в конфигурационном файле боб, как пример:

<bean id="myListener" class="mypackage.MyMessageListener" /> 

<bean id="queueBean" class="org.apache.activemq.command.ActiveMQTopic"> 
    <constructor-arg value="Queue-Request"/> 
</bean> 

<bean id="myListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="connectionFactoryBean" /> 
    <property name="destination" ref="queueBean" /> 
    <property name="messageListener" ref="myListener" /> 
</bean> 

Тогда вы можете написать класс MyMessageListener реализовать интерфейс MessageListener:

public class MyMessageListener implements MessageListener { 
    public void onMessage(Message message) { 
     //handle message here ... 
    } 
} 

Это гарантирует, что MyMessageListener будет получить сообщение, отправленное из очереди. Обратите внимание, что Queue - p2p, поэтому, если сообщение получено MyMessageListener, оно не будет получено другими слушателями, которые не подписываются на эту очередь.

Смежные вопросы