如何理解 JMS 中的“同步”和“异步”消息传递?
在阅读了JMS的一些文档后,我对短语和完全困惑。synchronous
asynchronouns
请参阅此页面: 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);
我有两个问题:
据我所知,JMS的本质是异步的。生产者将消息发布到队列/主题,它不需要等待消费者。这是异步行为。它怎么可能是“同步的”?
如果“mesageListener”是异步的,但在我用spring-jms进行的测试中,我发现它总是在线程中运行。这意味着,如果我写进去,它必须等待2秒钟才能处理下一条消息。它是“异步”的吗?
Thread.sleep(2000)
onMessage