AMQ学习笔记 - 10. Spring-JmsTemplate之浏览

概述


浏览只是针对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,我们应该可以这样使用:
1 QueueBrowser browser = session.createBrowser(queue);
2 Enumeration<Message> msgEnum = browser.getEnumeration();
3 browser.close();
4 
5 while (msgEnum.hasMoreElements()) {
6     Message msg = msgEnum.nextElement();
7 } 
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:
 1 List<String> contList = jt.browse(DESTINATION_NAME,
 2         new BrowserCallback<List<String>>() {
 3         
 4             public List<String> doInJms(Session session,
 5                     QueueBrowser browser) throws JMSException {
 6                     
 7                 MessageConverter converter = new SimpleMessageConverter();
 8                 List<String> messContentList = new ArrayList<String>();
 9                 
10                 @SuppressWarnings("unchecked")
11                 Enumeration<Message> messageEnum = browser
12                         .getEnumeration();
13                 while (messageEnum.hasMoreElements()) {
14                     Message msg = messageEnum.nextElement();
15                     String text = (String) converter.fromMessage(msg);
16                     messContentList.add(text);
17                 }
18                 return messContentList;
19             }
20         });
21         
22 for (String text : contList) {
23     System.out.println(text);
24 }

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



来自为知笔记(Wiz)



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