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
本文来自博客园,作者:一尾金鱼,转载请注明原文链接:https://www.cnblogs.com/ywjy/articles/5433813.html