概述


前面我们分别介绍了发送、接收和浏览,这三个的实现都依赖于将要介绍的执行。
执行算是一个相对比较底层的方法系列,一般情况下,我们不需要直接面向将要介绍的方法。

执行


1.关于回调接口

在讲执行之前,我们先回忆一下之前将的发送、接收和浏览。JmsTemplate接管了整个过程,但是考虑到我们可能在某个特殊的阶段做一些特殊的处理,所以又在敏感的点给我们自主行为的机会——以回调接口的方式。我们实现回调,JmsTemplate在到了那个点时,调用我们的回调。让我们看一下我们接触到的回调接口:
发送
  • MessageCreator
    创建消息,使用基本的发送方法时可用
  • MessagePostProcessor
    消息后处理,使用转换、后处理再发送的方法时可用
浏览
  • BrowserCallback
    浏览消息
接下来,我们来接触两个新的回调接口。
 
Interface org.springframework.jms.core.ProducerCallback<T>
  • T doInJms(Session session, MessageProducer producer)
    面向发送的回调方法,实现消息的创建、发送,并自由返回想要的类型。
Interface org.springframework.jms.core.SessionCallback<T>
  • T doInJms(Session session)
    回调方法,接收Session资源,并自由通信和返回。

现在我们已经接触了5个回调接口,我们可以把MessageCreator、MessagePostProcessor归为一类,因为它们的名字表达了它们的作用,即它们是有非常强的目的性的,如果你实际上用它们来做其他的事情,恐怕有违设计者的初衷。我们把BrowserCallback、ProducerCallback、SessionCallback归为一类,因为它们的名字强调了它们需要的资源,或者说是被调用的时机。比如BrowserCallback需要QueueBrowser资源,在创建了QueueBrowser之后调用。其中,BrowserCallback和ProducerCallback所需要的资源的本身,也有非常强的目的:你要QueueBrowser就是为了浏览,你要MessageProducer就是为了发送。而SessionCallback需要的是Session资源,JMS中所有的通信类型都需要Session,所以我们也不能确定它的目的——即,它给了我们自由发挥的空间。

 
Session位于编程模型的唯一主干道,而且在末端,如下面这样:
Spring一贯的思想就是:帮我们做尽量多的事,又给我们留一定的空间做其他的事。

2.执行的方法

使用ProducerCallback和SessionCallback,JmsTemplate定义了5个方法。
Class org.springframework.jms.core.JmsTemplate
  • public <T> T execute(ProducerCallback<T> action)
    基于默认的Destination创建MessageProducer,并在该发送的时候调用回调接口,如何发送由回调接口的实现决定。
  • public <T> T execute(Destination destination, ProducerCallback<T> action)
    基于指定的Destination创建MessageProducer,并在该发送的时候调用回调接口,如何发送由回调接口的实现决定。
  • public <T> T execute(String destinationName, ProducerCallback<T> action)
    基于指定的name所对应的Destination创建MessageProducer,并在该发送的时候调用回调接口,如何发送由回调接口的实现决定。
  • public <T> T execute(SessionCallback<T> action)
    创建Session,执行回调方法并提供Session作为参数
  • public <T> T execute(SessionCallback<T> action, boolean startConnection)
    创建Session,执行回调方法并提供Session作为参数。startConnection表示是否在调用javax.jms.Connection#start()方法。如果你是写消息到broker,那么使用false;如果你是从broker获取消息(接收或者浏览),那么使用true。
 
最后我们给一个demo,这个demo来自JmsTemplate#send(Destination destination, MessageCreator messageCreator):
 @Override
public void send(final Destination destination, final MessageCreator messageCreator) throws JmsException {
execute(new SessionCallback<Object>() {
@Override
public Object doInJms(Session session) throws JMSException {
doSend(session, destination, messageCreator);
return null;
}
}, false);
}
P.S.第6行的doSend是一个protected的方法,简单说下:它需要session和destination来创建producer;需要messageCreator来创建message,然后producer发送message。我们的send并没有Session资源,所以在send和doSend之间,隔了一层SessionCallback,来获取Session资源。

AMQ学习笔记 - 11. Spring-JmsTemplate之执行的更多相关文章

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

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

  2. Spring4.0学习笔记(11) —— Spring AspectJ 的五种通知

    Spring AspectJ 一.基于注解的方式配置通知 1.额外引入的jar包: a) com.springsource.org.aopalliance-1.0.0.jar b) com.sprin ...

  3. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  4. Spring实战第八章学习笔记————使用Spring Web Flow

    Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...

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

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

  6. 并发编程学习笔记(11)----FutureTask的使用及实现

    1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...

  7. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

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

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

  9. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

随机推荐

  1. 从头学Android系列

    从头学Android系列 http://blog.csdn.net/worker90/article/category/888358

  2. PHP apache2.2 mysql 的安装

    1.安装准备 我的系统为win7 旗舰版 php:http://windows.php.net/downloads/releases/php-5.3.6-Win32-VC9-x86.zip mysql ...

  3. [AngularJS] Adding custom methods to angular.module

    There are situations where you might want to add additional methods toangular.module. This is easy t ...

  4. iOS执行时工具-cycript

    cycript是大神saurik开发的一个很强大的工具,能够让开发人员在命令行下和应用交互,在执行时查看和改动应用.它确实能够帮助你破解一些应用,但我认为这个工具主要还是用来学习其它应用的设计(主要是 ...

  5. cocos2d-x jsbinding 在线更新策略设计

    在线更新是用脚本编写游戏逻辑的特有功能,由于脚本语言是边解释边编译的特性,使得游戏在运行的时候可以通过下载最新的脚本来执行游戏逻辑.在不修改Native接口的情况下,在线更新每次更新只需要下载一个(5 ...

  6. CPU 100%

    http://www.cnblogs.com/xuehong1985/articles/757060.html

  7. D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力

    莫队算法就是优化的暴力算法.莫队算法是要把询问先按左端点属于的块排序,再按右端点排序.只是预先知道了所有的询问.可以合理的组织计算每个询问的顺序以此来降低复杂度. D. Powerful array ...

  8. TF-IDF算法扫盲2

    TF-IDF算法是一种简单快捷的文档特征词抽取方法,通过统计文档中的词频来对文档进行主题分类.TF-IDF(term frequency–inverse document frequency)是一种统 ...

  9. JS实现滚动条滚到页面距离底部300px时执行事件的方法

    scrollTop为滚动条在Y轴上的滚动距离. clientHeight为内容可视区域的高度. scrollHeight为内容可视区域的高度加上溢出(滚动)的距离 $(window).scroll(f ...

  10. Android 拍照 代码实例

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 这是我做的一个简单的利用Android手机的摄像头进行拍照的实例. 在这里我实现了基本的拍照.照片的存储 ...