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