概述


浏览只是针对Queue的概念,Topic没有浏览。浏览是指获取消息而消息依然保持在broker中,而消息的接收会把消息从broker中移除。
浏览可以用来实现对Queue中消息的监控。

JMS API


浏览的概念来源于JMS,所以有必要先把JmsTemplate放一放。先看一下下面的API:
Interface javax.jms.Session
  • QueueBrowser createBrowser(Queue queue)
    创建指定Queue的Browser对象。
  • QueueBrowser createBrowser(Queue queue, java.lang.String messageSelector)
    创建指定Queue的Browser对象,添加选择器筛选消息。
Interface javax.jms.QueueBrowser
  • java.util.Enumeration getEnumeration()
    获取Message的枚举,每一个元素都是Message实例
  • void close()
    通知broker可以回收分配给当前browser的资源
根据上面的API,我们应该可以这样使用:
 QueueBrowser browser = session.createBrowser(queue);
Enumeration<Message> msgEnum = browser.getEnumeration();
browser.close(); while (msgEnum.hasMoreElements()) {
Message msg = msgEnum.nextElement();
P.S.只是推论,没有验证。

JmsTemplate的API


JmsTemplate提供了2组*3,共计6个浏览的方法。
  1. 基本的浏览
  2. 带有选择器的浏览
 
鉴于我们对这种分组的习惯、消息选择器的概念都已经驾轻就熟,所以这里不再分开介绍。我们一鼓作气,解决掉吧:
Class org.springframework.jms.core.JmsTemplate
  • public <T> T browse(BrowserCallback<T> action)
    从默认的Queue中浏览消息,要求设置了默认的Destination,且类型为Queue。action是一个回调对象,它负责浏览消息,并返回浏览的结果。
  • public <T> T browse(Queue queue, BrowserCallback<T> action)
    从指定的Queue中浏览消息。
  • public <T> T browse(String queueName, BrowserCallback<T> action)
    从指定name的Queue中浏览消息。
  • public <T> T browseSelected(String messageSelector, BrowserCallback<T> action)
    从默认的Queue中浏览消息,添加了消息选择器。
  • public <T> T browseSelected(Queue queue, String messageSelector, BrowserCallback<T> action)
    从指定的Queue中浏览消息,添加了消息选择器。
  • public <T> T browseSelected(String queueName, String messageSelector, BrowserCallback<T> action)
    从指定name的Queue中浏览消息,添加了消息选择器。
Interface org.springframework.jms.core.BrowserCallback<T>
  • T doInJms(Session session, QueueBrowser browser)
    浏览队列中的消息,并返回浏览的结果。这是一个回调方法,Spring会为我们提供QueueBrowser对象,我们可以据此获取消息,并自由的转换。最后以我们希望的类型返回。
 
让我们先看下BrowserCallback定义的回调方法。我们在客户端和broker建立连接的整个过程中,截取这样的一段:
我们已经使用Session创建了QueueBrowser的实例,然后我们像前文的demo中那样浏览消息。我们决定对消息再做一下转换,比如如果能确定每一个消息的内容都是一个字符串,我们可以最终转换成java.util.List<String>类型的结果。
这个片段是我们浏览Queue的整个片段,这个片段也是BrowserCallback唯一关心的问题,我们定义了这个片段的具体实现,然后交给JmsTemplate,由它在合适的时候,按照我们定义的方式浏览并返回消息。
 
下面给个demo:
 List<String> contList = jt.browse(DESTINATION_NAME,
new BrowserCallback<List<String>>() { public List<String> doInJms(Session session,
QueueBrowser browser) throws JMSException { MessageConverter converter = new SimpleMessageConverter();
List<String> messContentList = new ArrayList<String>(); @SuppressWarnings("unchecked")
Enumeration<Message> messageEnum = browser
.getEnumeration();
while (messageEnum.hasMoreElements()) {
Message msg = messageEnum.nextElement();
String text = (String) converter.fromMessage(msg);
messContentList.add(text);
}
return messContentList;
}
}); for (String text : contList) {
System.out.println(text);
}

注意:我们在15行使用了转换的类,转换的概念我们已经在08. Spring-JmsTemplate之发送中介绍过了。

AMQ学习笔记 - 10. Spring-JmsTemplate之浏览的更多相关文章

  1. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  2. Spring4.0学习笔记(10) —— Spring AOP

    个人理解: Spring AOP 与Struts 的 Interceptor 拦截器 有着一样的实现原理,即通过动态代理的方式,将目标对象与执行对象结合起来,降低代码之间的耦合度,主要运用了Proxy ...

  3. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  4. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  5. Spring实战第五章学习笔记————构建Spring Web应用程序

    Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...

  6. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  7. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  8. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  9. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

随机推荐

  1. linux C高手成长过程---书籍推荐

    建议学习路径: 首先先学学编辑器,vim, emacs什么的都行. 然后学make file文件,只要知道一点就行,这样就可以准备编程序了. 然后看看<C程序设计语言>K&R,这样 ...

  2. asp.net 获取url

    string url = Request.Url.ToString(); this.ImageLogo.ImageUrl = "http://" + Request.Url.Aut ...

  3. android手机打电话代码分析

    智能手机的打电话功能是由RIL部分来实现的,见下图: 开始分析Android源代码中的RIL部分. 又上图,以及其他相关资料,我得知在Android中有一个叫rild的守护进程.我猜测此进程与电话的拨 ...

  4. document.createElement("A");

    搞了一天,终于把A里面的属性弄出来 代码1: <BODY></BODY><SCRIPT LANGUAGE="JavaScript"><!- ...

  5. [MongoDB] Query, update, index and group

    /* 1. Query Operators */ db.posts.find({ viewsCount: {$get: 1000, $lte: 3000} }, {_id: 0, viewsCount ...

  6. 剑指 offer set 10 栈的压入、弹出序列

    总结 1. 通过按位对比来判断, 没有更优的方法了

  7. Lucene的Vint类型详解

    Lucene Vint压缩策略是,用每个字节的最高位做标志位,后7位为有效算术位,如果标志位为1,则说明后一个字节和当前字节是同一个数字,为0说明后一个字节是一个新的数字 Lucene源代码中进行存储 ...

  8. 基数树(radix tree)

    原文   基数(radix)树 Linux基数树(radix tree)是将指针与long整数键值相关联的机制,它存储有效率,并且可快速查询,用于指针与整数值的映射(如:IDR机制).内存管理等.ID ...

  9. Linux高级字符设备驱动

    转载:http://www.linuxidc.com/Linux/2012-05/60469p4.htm 1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select ...

  10. Centos7升级gcc学习笔记

    概述 最近在学习<深入应用C++11-代码与优化与工程级应用>,我的gcc版本是gcc-4.8.5是支持C++11的,但是我在作者的github上看了一些C++例子,其中有些是C++14的 ...