概述


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

执行


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应用转换成BlackBerry PlayBook应用

    昨天写了篇文章关于Android应用转换的,通过BlackBerry的在线转换工具将Android应用转换成BlackBerry PlayBook应用.有网友反映说方法有点麻烦,所以今天补上新的转换方 ...

  2. #import与@class的区别

    转自:http://www.cnblogs.com/jqyp/archive/2012/01/13/2321707.html 1.import会包含这个类的所有信息,包括实体变量和方法,而@class ...

  3. Lucene的Vint类型详解

    Lucene Vint压缩策略是,用每个字节的最高位做标志位,后7位为有效算术位,如果标志位为1,则说明后一个字节和当前字节是同一个数字,为0说明后一个字节是一个新的数字 Lucene源代码中进行存储 ...

  4. 信号之sigprocmask函数

    一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集.调用函数sigprocmask可以检测或更改其信号屏蔽字,或者在一个步骤中同时执行这两个操作. #include <signal.h ...

  5. windows下使用代理连接github

    在公司的windows下使用github,因为github被墙,查了查,发现给在windows下的git制定代理很简单,一句话   git config --global http.proxy htt ...

  6. Is an MTD device a block device or a char device?

    转:http://www.linux-mtd.infradead.org/faq/general.html#L_mtd_what Note, you can find Ukranian transla ...

  7. 使用boost的deadline_timer实现一个异步定时器

    概述 最近在工作上需要用到定时器,然后看到boost里面的deadline_timer可以实现一个定时器,所以就直接将其封装成了ATimer类,方便使用,ATimer有以下优点: 可以支持纳秒.毫秒. ...

  8. 如何简单便捷的搭建一个网站 - 基于Django

    一.所需工具以及相关环境 1. 系统:win7,win8.1,win10(亲测可用 - 本文为win7,64位) 2. 本文使用的版本是: 1)python-2.7.11[百度云盘分享:http:// ...

  9. iOS “请在微信客户端打开链接” UIWebview加载H5页面携带session、cookie、User-Agent信息 设置cookie、清除cookie、设置User-Agent

    公司新开的一个项目..内容基本上是加载H5页面显示..当时觉得挺简单的..后来发现自己掉坑里了..一些心理历程就不说了..说这个项目主要用到的知识点吧..也是自己踩得坑. 首先说说..这个项目上的内容 ...

  10. WinForm中DefWndProc、WndProc与IMessageFilter的区别

    这篇文章主要介绍了WinForm中DefWndProc.WndProc与IMessageFilter的区别,较为详细的分析了WinForm的消息处理机制,需要的朋友可以参考下     一般来说,Win ...