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

2022-09-01 20:39:10

在阅读了JMS的一些文档后,我对短语和完全困惑。synchronousasynchronouns

请参阅此页面: http://docs.oracle.com/cd/E19798-01/821-1841/bncdq/index.html

同步

您可以使用接收方法来同步使用消息。调用 start 方法后,您可以随时使用此方法:

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

若要异步使用消息,请使用消息侦听器,下一节将对此进行介绍。

异步

JMS 消息侦听器 消息侦听器是充当消息的异步事件处理程序的对象。此对象实现 MessageListener 接口,该接口包含一个方法,onMessage。在 onMessage 方法中,定义消息到达时要执行的操作。

通过使用 setMessageListener 方法向特定的 MessageConsumer 注册消息侦听器。例如,如果定义一个名为 Listener 的类来实现 MessageListener 接口,则可以按如下方式注册消息侦听器:

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

我有两个问题:

  1. 据我所知,JMS的本质是异步的。生产者将消息发布到队列/主题,它不需要等待消费者。这是异步行为。它怎么可能是“同步的”?

  2. 如果“mesageListener”是异步的,但在我用spring-jms进行的测试中,我发现它总是在线程中运行。这意味着,如果我写进去,它必须等待2秒钟才能处理下一条消息。它是“异步”的吗?Thread.sleep(2000)onMessage


答案 1

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

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

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


答案 2

就像我理解的那样:

异步 - 消息管理器:在侦听队列的服务器上使用它。当消息到达时,请立即处理它。服务器继续侦听此队列。

同步 - 消费者.接收(1000):在客户端应用程序上使用它,这些应用程序不时需要检查消息是否适用于此客户端。示例:每 60 秒轮询一次。这只会很快打开与服务器的连接。1000 毫秒将使此连接保持打开状态。如果消息在这 1000 毫秒内到达,则使用该消息并关闭连接。


推荐