gpt4 book ai didi

java - 如何理解JMS中的 "synchronous"和 "asynchronouns"消息?

转载 作者:太空狗 更新时间:2023-10-29 22:44:17 26 4
gpt4 key购买 nike

看了一些JMS的文档,我对synchronousasynchronous这两个词完全不解。

查看此页面:http://docs.oracle.com/cd/E19798-01/821-1841/bncdq/index.html

同步

You use the receive method to consume a message synchronously. You can use this method at any time after you call the start method:

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

To consume a message asynchronously, you use a message listener, described in the next section.

异步

JMS Message Listeners A message listener is an object that acts as an asynchronous event handler for messages. This object implements the MessageListener interface, which contains one method, onMessage. In the onMessage method, you define the actions to be taken when a message arrives.

You register the message listener with a specific MessageConsumer by using the setMessageListener method. For example, if you define a class named Listener that implements the MessageListener interface, you can register the message listener as follows:

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

我有两个问题:

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

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

最佳答案

如果你这样理解得更好,consumer.receive() 使用了一个pull 模型:你从一个队列中读取并被阻塞等待这个消息直到它到来,或者超时已经过去。

使用监听器使用推送模型:您注册一个监听器,当收到消息时,将在单独的线程中调用监听器。

在Java中一切都是在一个线程中完成的,监听调用也不异常(exception)。监听器消息处理是否阻止处理队列中的其他消息取决于有多少线程专用于消息处理。如果您将 Spring 配置为使用 5 个线程池来异步处理消息,那么 5 个监听器将能够并行处理消息。

关于java - 如何理解JMS中的 "synchronous"和 "asynchronouns"消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22088873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com