文档章节

实现Spring中的任务调度及异步执行

chace0120
 chace0120
发布于 2014/08/01 14:53
字数 1978
阅读 1667
收藏 23

    首先要端正一下本人的态度,开发了很长时间的Java Web项目,寄托于Spring MVC的架构,多数时间都是在处理业务逻辑问题,所以我个人单纯地认为Web开发,多线程的应用场景应该不多,能不用尽量不用(当然,有这样的想法,那也是我个人多线程运用不多,理解不是很深刻,而且多线程并发操作需要面对和处理的问题很多,像共享资源上锁等)。但现在需要用到了,才明白多线程的应用场景是多么的重要。所以这几天开始在多线程方面进行了研究,下面总结我这几天的理解和认知。

    先阐述下,我在Web项目开发中为什么会用到多线程?项目背景是这样的:门户网站中添加了页面静态化的功能,那对于静态页面内容的更新,采用什么更新策略呢?我用的是最简单的方法,启用定时任务,每隔一段指定的时间清空静态页面文件所在的目录(关于这点,如果有更好做法或建议的,请指点一哈),在项目开始运行时,就启用定时任务开始工作。显然,启用定时任务,可以简化认为开始一个新的线程,来专门执行删除静态页面文件的操作。

    为了实现上述的功能,不需要我们从最原始的多线程编程方式入手,通过网上的搜索,大致有三种解决方案。如下:

  • 使用Quartz开源任务调度框架。

  • 使用JDK Timer类。

  • 使用Spring“原生态”的Spring Task。

    针对前两种方法,Spring都给予了完美的封装和整合。那么关于Quartz和JDK Timer是什么,做什么,怎么用,可以自己搜索下,这里不作重点描述。但需要强调的是,这么多的方法,哪个是适用的。

    一、多种任务调度方案的对比

  • Quartz:复杂,重量级,功能强大;可以实现定时、定点的任务调度;提供了调度运行环境的持久化机制;提供组件式的侦听器、各种插件、线程池等功能。

  • JDK Timer:可以完成简单的定时任务调度;只适合执行时间非常短的任务调度;由于Timer中所有的任务在单一的背景线程中运行,经常会出现时间漂移、任务挤压等问题。

  • Spring任务调度:可以看作是轻量级的“Quartz”,可以实现定时、定点的任务调度功能;是Spring自带的功能,使用简单方便。

    综合上述内容,由于要解决的问题很简单,就选用了Spring任务调度。当然,如果需要更为复杂的任务调度功能时,还是要选用Quartz的。至于JDK Timer,局限太多,不作考虑了。选定了解决方案后,谈一下我在学习和了解过程的一些感悟。

    二、理解任务、异步、多线程

    我在调研Quartz、JDK Timer和Spring任务调度的过程中,见到最多的关键词是任务、调度、异步、线程等。可能有人会疑惑,本文开头我强调的是多线程,可说到这儿用到的却是任务调度,这两个概念有何关联?我谈下我的理解,不一定对,欢迎指正。

    我在看相关资料时,包括Spring文档中,相提并论是任务调度和异步执行。我认为:

  • 任务的重点在于调度。

  • 异步(操作)的重点在于并发。

  • 一个异步操作也可以当作一个任务,但可能并不涉及调度。

    上述两点的实现依靠多线程的技术。而其中Quartz以及Spring的封装、优化中都提到了线程池技术,我认为线程池是多线程编程,或者准确地说并发操作的一种优化措施。

    三、认知TaskExceutor和TaskScheduler

    在学习Spring文档中任务调度的相关部分时,接触到了TaskExecutor和TaskScheduler。这里我只简单描述一下自己的理解,因为自己感觉理解的不是很透彻,所以这点还望高人看到后能给予补充纠正。

    JDK5.0新增了一个并发工具包java.util.concurrent,其中执行器Executor是其中一个重要的类。Executor的存在是为了方便处理并发操作,它对Runnable实例的执行进行了抽象,使实现者可以提供更为丰富的实现。JDK5.0提供的实现者大多拥有线程池的内在支持,Spring为Executor处理引入了新的抽象层,继而诞生了TaskEexcutor和TaskScheduler。

    不过值得注意的是,TaskExecutor的实现也提供了很多线程池的支持,可见利用线程池来处理数量巨大的短小并发任务是有很大好处的,具体可以了解下Java线程池的意义。但TaskExecutor并不全是使用线程池的,具体使用场景可以查看Spring文档中关于TaskExecutor的实现。

    我所认为的是,TaskExecutor的作用是绑定Runnable实例,可以决定是否实现异步操作,类似我们使用过的new Thread(Runnable run)。而TaskScheduler更多的则是为了绑定异步操作时,同时设定调度规则。但谈到这里,我抛出一个疑惑,非异步操作的任务是否存在调度的意义?个人感觉关于TaskScheduler的实现应用较多还是ThreadPoolTaskScheduler,主要是对异步任务的调度处理。下面来具体谈一下使用Spring对任务调度的实现吧。

    四、Spring任务调度功能的理解

    有种较好的理解,应用程序执行的与用户行为无关的操作成为后台任务。而Spring对后台任务分为了两种,并提供了封装与实现,如下:

  • 调度任务

  • 异步方法

    Spring同样提供了xml配置和注解两种方式来实现后台任务的功能。

    http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html中描述的很详细,这里我不再做过多说明。重点强调我对一些关键点的理解。

  • 无论是注解还是xml配置,在用到了task命名空间,需要在Spring的配置文件中声明task的命名空间。

  

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="5"/>
<task:scheduler id="myScheduler" pool-size="10"/>


  • 如上代码所示,使用注解方式,需要在Spring配置文件中添加<task:annotation-driven />。<task:executor .../>

    会创建一个ThreadPoolTaskExecutor实例,负责处理标注了@Async注解的异步任务。<task:scheduler .../>会创建一个ThreadPoolTaskScheduler,负责管理调度标注了@Scheduled的方法。可见这样的配置都采用了线程池的技术。如果没有设置pool-size属性,线程池中默认只保持一个线程。

   @Scheduled注解可以对指定方法进行调度,配合fixedDelay、fixedRate和cron属性,可以制定详细的调度规则。

  @Async注解可以指定方法,在被调用时,以异步的方式执行。

    


© 著作权归作者所有

chace0120
粉丝 38
博文 49
码字总数 42222
作品 0
安阳
程序员
私信 提问
加载中

评论(1)

奥思刘冬
奥思刘冬
哥哥呀,咋不完整写个例子。@Async怎么用?
Quartz的简单易懂定时任务实现

作为一个优秀的开源调度框架,Quartz 具有以下特点: 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求; 灵活的应用方式,例如支持任务和调度的多种组合方式,支持...

begrateful
2018/09/18
0
0
Spring Boot Quartz 分布式集群任务调度实现

主要内容 Spring Scheduler 框架 Quartz 框架,功能强大,配置灵活 Quartz 集群 mysql 持久化定时任务脚本(tables_mysql.sql) 介绍 在工程中时常会遇到一些需求,例如定时刷新一下配置、隔一...

编辑之路
06/21
132
0
如何在 Spring 异步调用中传递上下文

什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行。异步调用...

aoho
08/01
0
0
springboot 使用 @Scheduled 注解实现任务调度 以及相关踩坑记录

关于spring boot 实现任务调度的方法有很多种,这里不再赘述。 首先pom只需引入 <dependency> </dependency> 然后application开启@EnableScheduling @SpringBootApplication@EnableAsync@En......

qiao_lu
2018/08/17
245
0
Spring中的任务(异步,定时,发邮件)

一 Spring中的异步任务使用: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完...

刘信坚
2018/06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
41
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部