在阅读了JMS的一些文档后,我完全被synchronous
和asynchronouns
这个短语所困惑。如何理解JMS中的“同步”和“异步”消息传递?
看到这个页面: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注册消息侦听器。例如,如果你定义一个类名为监听器实现MessageListener接口,您可以按如下注册消息监听器:
Listener myListener = new Listener(); consumer.setMessageListener(myListener);
我有两个问题:
至于我的理解,JMS的本质是异步的。生产者将消息发布到队列/主题,它不需要等待消费者。这是异步行为。它怎么可能是“同步”?
如果“mesageListener”是异步的,但是在使用spring-jms进行测试时,我发现它总是在一个线程中运行。这意味着,如果我在
onMessage
中编写Thread.sleep(2000)
,则必须等待2秒才能处理下一条消息。它是“异步”吗?
感谢您的“拉”和“推”解释! – Freewind