概述


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

执行


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. MyEclipse7.0破解下载

    MyEclipse7.0 下载地址:downloads.myeclipseide.com/downloads/products/eworkbench/7.0M1/MyEclipse_7.0M1_E3. ...

  2. js 获取cookie

      <!DOCTYPE html>   <html xmlns="http://www.w3.org/1999/xhtml">       <head ...

  3. css常用知识

    1.基本语法规范p {color:#ff0000;background:#ffffff}a.其中"p"称为"选择器"(selectors),指明我们要给&quo ...

  4. Xcode快照——管理应用程序版本

    转自:http://blog.csdn.net/yuanbohx/article/details/8919474 1.创建快照:FIle → Create Snapshot 2.查看快照:Window ...

  5. Spring.NET 与 NHibernate

    回到 Spring.NET & NHibernate of C#.NET 技术论坛 实战C#.NET编程----Spring.NET & NHibernate从入门到精通 您可以从以下 ...

  6. ci框架学习中注意的事项

    视图: 加载视图:$this->load->view('name'); 一次可以加载多个视图,如: public function index() { $data['page_title' ...

  7. 如何为Linux安装Go语言

    导读 Go 语言又称为 golang, 是由 Google 最初开发的一种开源编程语言,其在设计时就遵循了简单.安全和速度的 3 大原则.Go 语言具有多种调试.测试.分析和代码审查工具,如今 Go ...

  8. Linux scp 使用详解

    一般情况,本地网络跟远程网络进行数据交抱,或者数据迁移,常用的有三种方法,一是ftp,二是wget /fetch 三是,rsync 大型数据迁移用rysync,其次用fetch/wget ,最次是ft ...

  9. iOS网络监测如何区分2、3、4G?

    你可以在Github下载这个Demo 首先,引入系统的Reachability类,不知道怎么引入的话,在Xcode,按下shift+command+0,搜索Reachability,看到图中所选的工程 ...

  10. JS Math算数

    Math.ceil()ceil() 方法可对一个数进行上舍入. ceil英译 天花板 参数必须是一个数值.返回值大于等于 x,并且与它最接近的整数. Math.floor()floor() 方法可对一 ...