AMQ学习笔记 - 03. 消息的接收方式

概述


消息有两种接收方式:同步接收和异步接收。
同步接收:主线程阻塞式等待下一个消息的到来,可以设置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之后的处理:
同步接收/阻塞式接收
1 long timeout = 10 * 1000;
2 for (Message message = consumer.receive(timeout); message != null; message = consumer
3         .receive(timeout)) {
4     String text = ((TextMessage) message).getText();
5     System.out.println(String.format("receive a message:%s", text));
6 }

 

异步接收/事件驱动接收
 1 consumer.setMessageListener(new MessageListener() {
 2     public void onMessage(Message message) {
 3         try {
 4             String text = ((TextMessage) message).getText();
 5             System.out.println(text);
 6         } catch (JMSException e) {
 7             e.printStackTrace();
 8         }
 9     }
10 });

 

暂停退出

不过异步接收还有另外一个问题需要考虑:因为主线程开启了一个子线程进行监听,所以主线程可以继续往下走,但是如果代码执行完毕,主线程结束,子线程也会结束,也就无法监听了。所以要想个办法让主线程在退出之前暂停。
可以在释放资源并退出之前,调用下面的方法:
 1 /**
 2  * 等待用户输入.<br>
 3  * 用于阻碍程序立即退出,以等待监听事件的到来.
 4  */
 5 private static String waitInput() {
 6     @SuppressWarnings("resource")
 7     java.util.Scanner scanner = new java.util.Scanner(System.in);
 8     System.out.println("按Enter键退出:");
 9     String next = scanner.nextLine();
10     return next;
11 }
 
如果你想看完整的异步接收的代码:AsynConsumer.java



来自为知笔记(Wiz)



posted on 2016-04-26 11:16  一尾金鱼  阅读(5744)  评论(0编辑  收藏  举报