概述
消息有两种接收方式:同步接收和异步接收。
同步接收:主线程阻塞式等待下一个消息的到来,可以设置timeout,超时则返回null。
异步接收:主线程设置MessageListener,然后继续做自己的事,子线程负责监听。
接收方式
同步接收又称为阻塞式接收;异步接收又称为事件驱动的接收。
API
同步接收,是在获取MessageConsumer实例之后,调用以下的API:
- receive():Message
获取下一个消息。这个调用将导致无限期的阻塞,直到有新的消息产生。 - receive(long timeout):Message
获取下一个消息。这个调用可能导致一段时间的阻塞,直到超时或者有新的消息产生。超时则返回null。 - receiveNoWait():Message
获取下一个消息。这个调用不会导致阻塞,如果没有下一个消息,直接返回null。
异步接收,是在获取MessageConsumer实例之后,调用下面的API:
- setMessageListener(MessageListener):void
设置消息监听器
MessageListener是一个接口,只定义了一个方法:
- onMessage(Message message):void
这是一个回调方法,当有新的消息产生,这个方法会被自动调用。
所以,为实现异步接收,只需要对MessageListener进行实现,然后设置为consumer实例的messageListener。
核心代码
同步接收和异步接收,不同的地方在于创建Consumer之后的处理:
同步接收/阻塞式接收 |
long timeout = 10 * 1000; |
异步接收/事件驱动接收 |
consumer.setMessageListener(new MessageListener() { |
暂停退出
不过异步接收还有另外一个问题需要考虑:因为主线程开启了一个子线程进行监听,所以主线程可以继续往下走,但是如果代码执行完毕,主线程结束,子线程也会结束,也就无法监听了。所以要想个办法让主线程在退出之前暂停。
可以在释放资源并退出之前,调用下面的方法:
/**
* 等待用户输入.<br>
* 用于阻碍程序立即退出,以等待监听事件的到来.
*/
private static String waitInput() {
@SuppressWarnings("resource")
java.util.Scanner scanner = new java.util.Scanner(System.in);
System.out.println("按Enter键退出:");
String next = scanner.nextLine();
return next;
}
如果你想看完整的异步接收的代码:AsynConsumer.java