`

Spring调度和后台任务

阅读更多

   Spring应用上下文中添加一行配置:

xmlns:task="http://www.springframework.org/schema/task" 

http://www.springframework.org/schema/task

http://www.springframework.org/schema/task/spring-task-3.0.xsd" 

    元素是Spring自动支持调度和异步方法。这些方法分别使用@Scheduled和@Async来进行标注。

 

1、声明调度方法

 

//每隔24小时(86 400 000毫秒)触发一个方法:

@Scheduled(fixedRate=86400000)

public void archiveOldSpittles(){

  //...

}

    属性fixedRate表明这个方法需要每隔指定的毫秒数进行周期性地调用。在上面的示例中,每次方法开始调用之间要经历86,400,000毫秒。如果你想指定调用之间的间隔(也就是一次调用完成与下一次调用开始之间的间隔),那需要使用fixedDelay属性:

@Scheduled(fixedDelay=86400000)

public void archiveOldSpittles(){

  //...

}

    在指定间隔后运行任务是很便利的。但是,你可能先概要更精确地控制方法调用。使用fixedRate和fixedDelay只能指定方法调用的频率,但是并不能确定方法在何时调用。为了更确切地指定方法在什么时间调用,可以使用cron属性:

@Scheduled(cron="0 0 0 * * SAT")

public void archiveOldSpittles(){

  //...

}

    赋予cron属性的值是一个Cron表达式。如果你不熟悉Cron表达式,那么我们详细介绍一下cron属性。Cron表达式由6个(或者7个)空格分隔的时间元素构成。从左至右,元素定义如下:

秒(0-59);

分钟(0-59);

小时(0-23);

月份中的日期(1-31);

月份(1-12 或 JAN-DEC);

星期中的日期(1-7 或 SUN-SAT);

年份(1970-2099);

    每个元素都可以显式地指定值、范围、列表或者通配符(*)。月份中的日期和星期中的日期这两个元素是互斥的,因此应该通过设置一个问号(?)来表明你不想设置的那个字段。如下表:

Cron表达式 含义

0 0 10,14,16 * * ? 每天的10点、14点、16点

0 0,15,30,45 * 1-30 * ? 每个月前30天每隔15分钟

30 0 0 1 1 ? 2012 2012年1月1日00:00:30时

0 0 8-17 ? * MON-FRI 每个工作日的工作时间

 

2、声明异步方法

 

    当谈及面向人类用户的应用程序性能时,会有两种类型的应用性能:实际上的和感知上的。应用程序的实际性能(actual performance),指的是独立测量完成一项操作需要多长时间。实际性能当然很重要,即便实际性能并不理想,但可以通过感知性能改善用户的体验。

    感知性能(perceived performance)恰好如其名所示。只要用户能够独立即看到变化,谁会关心背后耗用多少时间呢?例如,假设添加Spittle实际上是耗时的操作。如果同步执行,感知性能就是一个方法的实际性能。在Spittle真正保存之前,用户必须等待。

    但是如果SpitterService的saveSpittle()方法可以实现异步执行。那么应用可以在执行后台持久化逻辑时为用户展现一个新的页面。这就是@Async注解所做的事情。

    @Async是一个很简单的注解,它没有要设置的属性。你所需要做的就是将其用与Bean的方法上,这个方法就会称为异步的了。

    例如

@Async

public void addSpittle(Spittle spittle){

  //...

}

    就是这样。当saveSpittle()方法被调用的时候,控制权会立即交给调用者。同时,saveSpittle()方法将会在后台继续运行。

    你可能想知道如果异步方法需要返回值给调用者会怎么样?如果异步方法立即返回的话,那它如何传递结果给调用者呢?

    因为Spring的异步方法是简历在Java的并发API(Javaconcurrency API)之上的,它可以返回实现java.util.concurrent.Future的对象。这个接口代表了一个值的容器,而值能在方法返回后的某个时间点得到,但并不一定是方法返回的时间点。Spring还自带了一个Future的便利实现,名为AsyncResult,借助与它可以更容易地处理未来的值。

    例如,假设你有一个异步方法要执行复杂和长时间运行的计算。你希望在后台执行方法,但是还想在方法执行完成时马上看到结果。在这种情况下,你可将方法这样编写:

@Async

public Future performSomeReallyHairyMath(long input){

  //...

  return new AsyncResult(result);

}

    这个方法可以耗用很长的时间来产生结果,与此同时调用者可以执行其他要做的业务。在结果的计算过程中,调用者会持有一个Future对象(实际上是AsyncResult)。

    一旦得到结果,调用者可以通过调用Future对象的get()方法来得到它。在此之前,调用者可以使用isDone()和isCancelled()来判断结果的状态。

 

本文摘自Spring实战14.4调度和后台任务

分享到:
评论

相关推荐

    Spring实现任务调度

    通过合理配置和使用`TaskExecution`、`TaskScheduling`、Quartz等工具,开发者可以构建出高效且可靠的后台任务执行系统。在实际项目中,选择适合的调度方式和工具,能显著提升系统的自动化程度和运行效率。

    spring 任务调度实现代码例子

    这会启动一个后台任务扫描器,定期检查带有`@Scheduled`注解的方法。 7. **调整调度配置** 你可以通过`@ConfigurationProperties`注解的`TaskProperties`类来调整任务调度的配置,例如线程池大小、任务超时等。 8...

    使用spring调度

    Spring调度允许开发者安排一次性或周期性的任务执行,这对于实现后台服务、定时任务或者批处理作业非常有用。本篇文章将深入探讨Spring调度的使用,包括核心概念、配置方式以及源码解析。 1. **Spring调度核心组件*...

    Spring定时调度简单实现源码

    这个"Spring定时调度简单实现源码"很显然是一个关于如何在Spring中配置和使用定时任务的示例代码包。下面我们将深入探讨Spring的定时调度机制以及其核心组件。 Spring的定时任务调度主要依赖于两个关键组件:`Task...

    Spring 框架自带定时任务和Quartz定时任务

    Quartz不仅可以调度单个任务,还可以构建一个集群的调度环境,并且可以与数据库交互,支持监听器、插件和集群功能,适合大型分布式系统和需要高可用性的场景。 Quartz还提供了更为复杂的调度表达式,可以精确地定义...

    (动态多)定时任务源码自动运行调度后台执行

    5、C#定时调度任务服务(Quartz.net做为任务调度核心,利用Log4Net做为日志输出,C#完成WINDOWS服务在后台定时执行任务) 6、android 后台定时执行任务 示例源码 7、C# Quatrz定时任务job实现 8、Quartz.NET定时任务...

    spring调度器

    Spring调度器主要由两个核心组件组成:`TaskExecutor`和`TaskScheduler`,它们分别用于异步执行任务和计划任务。 **TaskExecutor** `TaskExecutor`是Spring提供的一个接口,用于执行异步任务。通过实现这个接口,你...

    spring的自带定时任务

    这会启动一个后台任务调度器,定期检查带有`@Scheduled`的方法并执行。 ```java import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Component; @...

    spring集成quartz 任务调度

    通过深入学习和实践这个示例,你将能够掌握如何利用Spring和Quartz构建灵活、可扩展的定时任务系统,这对于开发企业级应用,特别是需要定期执行数据处理、报告生成或其他后台任务的应用来说,是非常有价值的。

    JBPM3.2与Spring结合时任务调度的实现.doc

    通过这样的配置,JBPM3.2和Spring的集成使得开发者可以利用Spring的依赖注入和管理能力,更加灵活地控制和管理JBPM的任务调度。同时,由于任务调度的配置和执行都在后台进行,不会阻塞主线程,提高了系统的响应性能...

    Spring 任务调度

    总结来说,Spring的任务调度通过集成JDK的Timer或更高级的Quartz库,为开发者提供了灵活且强大的后台任务执行能力。无论是简单的定时任务还是复杂的调度需求,都能得到很好的满足。在设计和实现任务调度时,需要注意...

    使用Spring Task开发定时任务的Demo

    这会启动一个后台任务调度线程,定期检查是否有需要执行的任务。 ```java @Configuration @EnableScheduling public class AppConfig { // ... } ``` ### 5. 执行异步任务 Spring Task还支持异步执行任务,通过`...

    转:spring多个定时任务quartz配置

    在Spring框架中,Quartz是一个强大的任务调度库,可以用于执行定时任务。本文将深入探讨如何在Spring中配置多个Quartz定时任务,并结合`quartz....正确配置和使用,能够帮助我们构建高效、可靠的后台任务系统。

    spring定时任务依赖的jar包

    1. **Spring Task模块**:这是Spring提供的一个核心模块,用于执行后台任务和定时调度。它提供了两种主要的方式来安排任务:`@Scheduled`注解和`ThreadPoolTaskScheduler`。前者允许在方法上声明定时任务,而后者则...

    Spring定时任务(Web项目)

    Spring框架的定时任务功能主要依赖于`Spring Task`模块,也称为Spring的后台任务处理。它提供了基于`@Scheduled`注解和`TaskScheduler`接口的两种定时任务实现方式。`@Scheduled`适用于简单的定时任务,而`Task...

    Spring的定时任务开发及对Quartz和Timer支持

    在【标题】"Spring的定时任务开发及对Quartz和Timer支持"中,涉及到的是Spring在处理定时任务方面的特性,这在企业级应用中非常常见,用于执行一些周期性的后台任务,如数据同步、报表生成、清理任务等。 首先,...

    Spring定时任务实现(非Web项目)

    `@EnableScheduling`注解会启动一个后台任务调度器,定期检查是否存在需要运行的`@Scheduled`方法。 2. **定义定时任务**:在需要执行定时任务的类上,我们可以定义一个或多个`@Scheduled`注解的方法。例如: ```...

    Spring3.0作业调度

    在现代系统中,作业调度用于自动化执行批量任务,这些任务通常在后台运行,无需用户交互,且随着任务数量和复杂性的增加,调度器的作用更为关键。 【为什么要使用作业调度】?主要原因是提高效率和减少错误。手动...

    后台管理源码spring boot版.rar

    9. **定时任务**(Spring Scheduler):可能包含有后台任务调度,用于执行周期性任务。 10. **单元测试**:开发者可能会提供一些测试类,用于验证各个组件的功能。 通过这个源码,开发者可以学习到Spring Boot如何...

    Spring3.0定时任务简单实例web工程

    Spring提供了`TaskExecutor`接口和`TaskScheduler`接口来处理异步任务和定时任务。在这个项目中,我们更可能使用`TaskScheduler`,因为它可以灵活地设置定时任务的执行计划。 要启用定时任务,我们需要在Spring配置...

Global site tag (gtag.js) - Google Analytics