概述


消息有两种接收方式:同步接收和异步接收。
同步接收:主线程阻塞式等待下一个消息的到来,可以设置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;
for (Message message = consumer.receive(timeout); message != null; message = consumer
.receive(timeout)) {
String text = ((TextMessage) message).getText();
System.out.println(String.format("receive a message:%s", text));
}
异步接收/事件驱动接收
 consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
String text = ((TextMessage) message).getText();
System.out.println(text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});

暂停退出

不过异步接收还有另外一个问题需要考虑:因为主线程开启了一个子线程进行监听,所以主线程可以继续往下走,但是如果代码执行完毕,主线程结束,子线程也会结束,也就无法监听了。所以要想个办法让主线程在退出之前暂停。
可以在释放资源并退出之前,调用下面的方法:
 /**
* 等待用户输入.<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

AMQ学习笔记 - 03. 消息的接收方式的更多相关文章

  1. AMQ学习笔记 - 09. Spring-JmsTemplate之接收

    概要 JmsTemplate提供了4组*3,共计12个接收用的方法.   JmsTemplate接收所需要的资源ConnectionFactory和Destination,和发送是一致的.   接收的 ...

  2. AMQ学习笔记 - 04. 消息选择器

    概述 消息选择器使用类似于SQL语法,为Consumer指定基于Message属性的筛选条件. 消息选择器 发送的时候,给消息添加一些属性:在接收的时候,根据属性进行过滤. API javax.jms ...

  3. AMQ学习笔记 - 13. Spring-jms的配置

    概述 如何使用spring-jms来简化jms客户端的开发? 这篇文章主要记录如何配置以便以后复用,而非原理的讲解,有些内容我 没有掌握原理. producer端 producer端负责发送,这里使用 ...

  4. Redis:学习笔记-03

    Redis:学习笔记-03 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 7. Redis配置文件 启动 ...

  5. .NET Remoting学习笔记(二)激活方式

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:百度百科  ♂风车车.Net 激活方式概念 在 ...

  6. 【转载】.NET Remoting学习笔记(二)激活方式

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:百度百科 ♂风车车.Net 激活方式概念 在访 ...

  7. SaToken学习笔记-03

    SaToken学习笔记-03 如果排版有问题,请点击:传送门 核心思想 所谓权限验证,验证的核心就是一个账号是否拥有一个权限码 有,就让你通过.没有?那么禁止访问! 再往底了说,就是每个账号都会拥有一 ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试

    机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...

  9. C++ GUI Qt4学习笔记03

    C++ GUI Qt4学习笔记03   qtc++spreadsheet文档工具resources 本章介绍创建Spreadsheet应用程序的主窗口 1.子类化QMainWindow 通过子类化QM ...

随机推荐

  1. [CF620E]New Year Tree

    题目大意:有一棵以$1$为根的有根树,有$n$个点,每个节点初始有颜色$c_i$.有两种操作: $1 v c:$将以$v$为根的子树中所有点颜色更改为$c$ $2 v:$ 查询以$v$为根的子树中的节 ...

  2. 【学习笔记】Learning OpenCV3——Ch8 working with video

    Reading Video with the cv::VideoCapture Object 对象创建的三种方法: // 1. Input filename cv::VideoCapture::Vid ...

  3. The 13th Zhejiang Provincial Collegiate Programming Contest - I

    People Counting Time Limit: 2 Seconds      Memory Limit: 65536 KB In a BG (dinner gathering) for ZJU ...

  4. bzoj 5092 [Lydsy1711月赛]分割序列 贪心高维前缀和

    [Lydsy1711月赛]分割序列 Time Limit: 5 Sec  Memory Limit: 256 MBSubmit: 213  Solved: 97[Submit][Status][Dis ...

  5. CSS属性中cursor:hand

    在 IE 下设置鼠标为手型的方法: cursor: hand,但是在 FIREFOX 中是无效的,解决方法是在FIREFOX中设置: cursor: pointer. 而这个pointer 值在IE和 ...

  6. leetcode-501. Find Mode in Binary Search Tree

    Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...

  7. bzoj4128 Matrix

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 [题解] 矩阵版本的BSGS. 至于如何不需要求逆,详见:http://www.cnb ...

  8. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  9. [bzoj3669][Noi2014]魔法森林——lct

    Brief description 给定一个无向图,求从1到n的一条路径使得这条路径上最大的a和b最小. Algorithm Design 以下内容选自某HN神犇的blog 双瓶颈的最小生成树的感觉, ...

  10. C#格式化时间,货币

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...