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

概要


JmsTemplate提供了4组*3,共计12个接收用的方法。
 
JmsTemplate接收所需要的资源ConnectionFactory和Destination,和发送是一致的。
 
接收的方法有4组:
  1. 基本的接收
  2. 接收并转换
  3. 带有选择器的接收
  4. 选择接收并转换

1.基本的接收方法


JmsTemplate提供了3个基本的接收方法,与发送的方法进行对比:
接收 发送
  • public Message receive(Destination destination)
    从指定的Destination接收消息并返回
  • public Message receive(String destinationName)
    从指定的Destination接收消息并返回。
  • public Message receive()
    从默认的Destination接收消息并返回。
  • public void send(Destination destination, MessageCreator messageCreator)
    将消息发送到指定的Destination
  • public void send(String destinationName, MessageCreator messageCreator)
    将消息发送到指定的Destination。
  • public void send(MessageCreator messageCreator)
    将消息发送到defaultDestination。

接收到消息之后,需要对消息进行转换,再提取消息中的数据:
1 Message message = jt.receive(DESTINATION_NAME);
2  
3 // convert
4 if (message != null && message instanceof TextMessage) {
5     String text = ( (TextMessage) message ).getText();
6     System.out.println(text);
7 }

2.接收并转换的方法


与转换并发送的方法相对应,接收的时候也有接收并转换的方法:
  • public Object receiveAndConvert()
    参考public Message receive(),在此基础上做了转换。
  • public Object receiveAndConvert(Destination destination)
    参考
    public Message receive(Destination destination),在此基础上做了转换。
  • public Object receiveAndConvert(String destinationName)
    参考public Message receive(String destinationName),在此基础上做了转换。
下面给出使用的示例,并把上面的示例也拿过来,做一下比较:
convert
1 Object data = jt.receiveAndConvert(DESTINATION_NAME);
2  
3 if (data != null && data instanceof String) {
4     System.out.println(data);
5 } 
usual
1 Message message = jt.receive(DESTINATION_NAME);
2  
3 // convert
4 if (message != null && message instanceof TextMessage) {
5     String text = ( (TextMessage) message ).getText();
6     System.out.println(text);
7 } 
至少,我们不用再考虑收到的Message具体是哪一种类型的。

3.带有选择器的接收方法


到目前为止,我们介绍的接收会无差别接收指定的Destination中的消息。如果我们只想接收其中的一部分——基于一个筛选的条件,满足条件的消息快到碗里来,不满足的就留在锅里吧。这种“挑食”的行为就是通过选择器来实现的。
04. 消息选择器中,我们已经介绍了选择器是什么一回事,并给出了基于JMS API的demo;这里我们直接列出要说的三个方法吧:
  • public Message receiveSelected(String messageSelector)
    参考public Message receive(),只是加入了筛选条件。
  • public Message receiveSelected(Destination destination, String messageSelector)
    参考public Message receive(Destination destination),只是加入了筛选条件
  • public Message receiveSelected(String destinationName, String messageSelector)
    参考public Message receive(String destinationName),只是加入了筛选条件
 
然后,再给一个demo:
发送
 1 String message = "a message for test convertProcessAndSend.";
 2 jt.convertAndSend(DESTINATION_NAME, message,
 3         new MessagePostProcessor() {
 4  
 5             public Message postProcessMessage(Message message)
 6                     throws JMSException {
 7                 message.setIntProperty("order", 1);
 8                 return message;
 9             }
10         }); 
接收
1 jt.setReceiveTimeout(3*1000); // in milliseconds
2         
3 String messageSelector = "order = 1";
4 Message message = jt.receiveSelected(DESTINATION_NAME, messageSelector);
5  
6 if (message != null && message instanceof TextMessage) {
7     String text = ((TextMessage) message).getText();
8     System.out.println(text);
9 } 
消息选择器的语法类似于sql。你可能注意到在接收的时候,有调用jt.setReceiveTimeout(3*1000);这是因为JmsTemplate所有的接收,包括前面讲的和后面要讲的,都是阻塞式的——阻塞线程,等待接收,直到超过了预先设定的receiveTimeout,单位是毫秒。而它的初始值是0,表示无限等待。

4.选择接收并转换的方法


将选择器和转换进行叠加,我们得到了另外的三个方法:
  • public Object receiveSelectedAndConvert(String messageSelector)
  • public Object receiveSelectedAndConvert(Destination destination, String messageSelector)
  • public Object receiveSelectedAndConvert(String destinationName, String messageSelector)
 
如果你理解了选择器和转换的接收,应该可以轻松了解上面的方法。这里给出一个demo:
1 jt.setReceiveTimeout(3 * 1000); // in milliseconds
2  
3 String messageSelector = "order = 1";
4 Object data = jt.receiveSelectedAndConvert(DESTINATION_NAME, messageSelector);
5  
6 if (data != null && data instanceof String) {
7     System.out.println(data);
8 }

 



来自为知笔记(Wiz)



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