概要


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 }






发布评论

分享到:

IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

AMQ学习笔记 - 08. Spring-JmsTemplate之发送讲解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。