首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何理解JMS中的“同步”和“异步”消息?

如何理解JMS中的“同步”和“异步”消息?
EN

Stack Overflow用户
提问于 2014-02-28 07:26:12
回答 4查看 25.9K关注 0票数 24

在阅读了一些JMS文档之后,我对短语synchronousasynchronouns感到十分困惑。

见本页:http://docs.oracle.com/cd/E19798-01/821-1841/bncdq/index.html

同步

您可以使用接收方法同步地使用消息。您可以在调用start方法之后的任何时候使用此方法: connection.start();消息m= consumer.receive();connection.start();消息m= consumer.receive(1000);//秒后超时 若要异步使用消息,请使用下一节中描述的消息侦听器。

异步

消息侦听器是充当消息异步事件处理程序的对象。该对象实现MessageListener接口,其中包含一个方法onMessage。在onMessage方法中,定义消息到达时要采取的操作。 通过使用MessageConsumer方法将消息侦听器注册到特定的setMessageListener。例如,如果您定义了一个实现MessageListener接口的名为监听器的类,您可以按如下方式注册消息侦听器: Listener myListener =新侦听器();consumer.setMessageListener(myListener);

我有两个问题:

  1. 据我所知,JMS的本质是异步的。生产者将消息发布到队列/主题,它不需要等待使用者。这是异步行为。它怎么能是“同步的”呢?
  2. 如果"mesageListener“是异步的,但是在我使用spring进行的测试中,我发现它总是在线程中运行。这意味着,如果我用Thread.sleep(2000)编写onMessage,则必须等待2秒才能处理下一条消息。是“异步”吗?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-28 07:51:46

如果您像这样更好地理解它,consumer.receive()使用拉模型:您从队列中读取并阻塞等待此消息,直到消息出现,或者已经过了一些超时。

使用侦听器使用推送模型:注册侦听器,当消息传入时,在单独的线程中调用侦听器。

所有事情都是在Java中的线程中完成的,侦听器调用也不例外。侦听器消息处理是否阻止队列中其他消息的处理取决于有多少线程专用于消息处理。如果将Spring配置为使用由5个线程组成的池异步处理消息,则5个侦听器将能够并行处理消息。

票数 25
EN

Stack Overflow用户

发布于 2015-07-28 14:40:56

就像我理解的那样:

异步- MessageListener:在侦听队列的服务器上使用此方法。当一条消息到达时,立即处理。服务器一直在监听此队列。

同步- consumer.receive(1000):在客户端应用程序上使用此方法,这些应用程序不时需要检查是否有此客户端的消息。每60秒进行一次投票。这只会在短时间内打开到服务器的连接。1000毫秒将使此连接保持打开状态。如果一条消息在这1000毫秒内到达,则该消息将被消耗并关闭连接。

票数 8
EN

Stack Overflow用户

发布于 2016-08-24 06:20:35

你看的是从出版商到消费者的端到端。是的,无论同步/异步使用者如何,它都是从发布者到使用者的异步传递。但是,问题中的同步/异步只针对消费者,即从JMS (例如: ApacheMQ)到消费者。正如其他人所指出的,Sync使用者会顺序地从代理中提取消息并等待消息。异步使用者注册一个回调,其中消息被推送给他们(onMessage)。异步使用者可以在这些消息从JMS代理异步传递给他们时进行其他操作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22088873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档