概述


消息有两种接收方式:同步接收和异步接收。
同步接收:主线程阻塞式等待下一个消息的到来,可以设置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. [洛谷P2824][HEOI2016/TJOI2016]排序

    题目大意:一个全排列,两种操作: 1. $0\;l\;r:$把$[l,r]$升序排序2. $1\;l\;r:$把$[l,r]$降序排序 最后询问第$k$位是什么 题解:二分答案,把比这个数大的赋成$1 ...

  2. Notice : brew install php70

    To enable PHP in Apache add the following to httpd.conf and restart Apache: LoadModule php7_module  ...

  3. TCP ------ keep-alive - 判断TCP链路的连接情况

    TCP 是面向连接的 , 在实际应用中通常都需要检测对端是否还处于连接中.如果已断开连接,主要分为以下几种情况: 1.           连接的对端正常关闭,即使用 closesocket 关闭连接 ...

  4. classList详解,让你的js方便地操作DOM类

    在此之前,jQuery的hasClass.addClass.removeClass我们已经再熟悉不过了,然而我们并不会在每一个项目中都会去使用 jQuery或者Zepto,譬如在移动端的网页中,考虑到 ...

  5. Spring学习之路——单例模式和多例模式

    在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例) singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实 ...

  6. SSL_TLS

    http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 配置 IBM HTTP Server 以支持 TLS 1.2 http://www-01.ibm ...

  7. Java环境变量配置以及作用、JDK与JRE区别以及命令行引入jar包

    在配置环境变量中: 设置JAVA_HOME: 一是为了方便引用,比如,JDK安装在C:\jdk1.6.0目录里,则设置JAVA_HOME为该目录路径, 那么以后要使用这个路径的时候, 只需输入%JAV ...

  8. HDU2441 ACM(Array Complicated Manipulation)

    ACM(Array Complicated Manipulation) Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  9. 【 浅谈Linux路由机制 】

    以下均为个人实验验证结果,如有问题,恳请指正. 现在服务器一般都有四张网卡,给了我们更多网络模型的选择.为了业务的需求,有时我们需要如下网络架构 系统:centos 7.2 x64 两张网卡不在同一个 ...

  10. cpu中的缓存和操作系统中的缓存分别是什么?

    cpu中的缓存和操作系统中的缓存分别是什么? 在操作系统中,为了提高系统的存取速度,在地址映射机制中增加了一个小容量的联想寄存器,即块表.用来存放当前访问最频繁的少数活动页面的页数.当某用户需要存取数 ...