2014-02-28 2 views
12

После прочтения документа JMS я полностью озадачил фразу synchronous и asynchronouns.Как понять обмен сообщениями «синхронный» и «асинхронный» в JMS?

Смотрите эту страницу: http://docs.oracle.com/cd/E19798-01/821-1841/bncdq/index.html

Синхронный

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

connection.start(); 
Message m = consumer.receive(); 
connection.start(); 
Message m = consumer.receive(1000); // time out after a second 

Чтобы потребить сообщение асинхронно, вы используете сообщение слушатель, описанный в следующем разделе.

Слушатели Асинхронного

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

Вы регистрируете прослушиватель сообщений с помощью специального MessageConsumer с помощью метода setMessageListener. Например, если вы определяете класс с именем Слушатель, который реализует интерфейс MessageListener, вы можете зарегистрировать сообщение слушателя следующим образом:

Listener myListener = new Listener(); 
consumer.setMessageListener(myListener); 

У меня есть два вопроса:

  1. Как я понял, , характер JMS является асинхронным. Продюсер публикует сообщения в очередь/тему, ему не нужно ждать потребителя. Это асинхронное поведение. Как это может быть «синхронно»?

  2. Если «mesageListener» асинхронен, но в моем тесте с spring-jms я нашел, что он всегда работает в потоке. Это означает, что если я напишу Thread.sleep(2000) в onMessage, он должен ждать 2 секунды перед обработкой следующего сообщения. Это «асинхронно»?

ответ

12

Если вы понимаете, что лучше так, consumer.receive() использует тянуть модель: вы читаете из очереди и блокируются в ожидании этого сообщения, пока он не придет, или некоторый тайм-аут истечет.

Использование прослушивателя использует модель push: вы регистрируете прослушиватель и, когда приходит сообщение, слушатель вызывается в отдельном потоке.

Все сделано в потоке на Java, а вызов слушателя не является исключением. Независимо от того, обрабатывает ли обработка сообщений слушателя обработку других сообщений в очереди, зависит от того, сколько потоков посвящено обработке сообщений. Если вы настроите Spring использовать пул из 5 потоков для обработки асинхронных сообщений, то 5 слушателей смогут обрабатывать сообщения параллельно.

+0

Спасибо за объяснение «тянуть» и «толчок»! – Freewind

5

Как я понимаю, это:

асинхронный - MessageListener: Используйте это на сервере, который прислушивается к очереди. Когда сообщение поступит, немедленно обратитесь к нему. Сервер продолжает слушать эту очередь.

synchronous - consumer.receive (1000): Используйте это в клиентских приложениях, которые время от времени должны проверять, предназначено ли для этого клиента сообщение. Пример: опрос каждые 60 секунд. Это приведет к немедленному открытию соединения с сервером. 1000 миллисекунд будут поддерживать это соединение открытым. Если сообщение достигнет этих 1000 миллисекунд, сообщение будет потреблено и соединение будет закрыто.

2

Вы смотрите на это от конца до конца: от издателя до потребителя. Да, это асинхронная доставка от издателя к потребителю независимо от потребителя Sync/Async. Однако Sync/Async в вашем вопросе предназначен только для потребителей, то есть от брокера JMS (например: ApacheMQ) до потребителя. Как отмечали другие, пользователи Sync последовательно выводят сообщения от брокера и ждут сообщений. Асинхронные потребители регистрируют обратный вызов, когда на него нажимаются сообщения (onMessage). Потребители Async могут заниматься другими вещами, в то время как эти сообщения доставляются им асинхронно от брокера JMS.

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