`
liulanghan110
  • 浏览: 1072446 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

spring定时任务quartz

    博客分类:
  • JAVA
阅读更多

       一般的定时任务是采用的quartz, quartz有两种方式运行,第一种为普通的方式, 如果一个任务每三分钟执行一次,那么前三分钟的任务还没执行完,后面的任务会继续执行。这样的坏处会导致两个线程在同时处理一批数据,可能出现问题。

 

      第二种方式是,如果一个任务每三分钟执行一次,那么前三分钟的任务还没执行完,后面的任务会等待(线程等待),这样会出现一个长长的等待队列,并且会创建很多的等待线程。

 

        为了解决第二种方式的缺点,可以利用spring容器的特点。由于spring容器里的类一般是单例的,也就是只有一个实例,那么可以写如下的代码:

 

class test{
    private boolean isRunning = false;
    public void deal(){
        if(!isRunning ){
            isRunning = true;
            //do some things
            isRunning = false;
        } 
    }
}

 

      这样当前一个任务没执行完时,这时isRunning 为true,后面的任务如果也开始执行,那么由于是同一个实例,所以isRunning也为true,if(!isRunning)条件不成立,所以结束。

        但上面的代码有一个BUG,那就是do some things时,如果出现异常isRunning将一直是true,后面的任务也不能运行。所以需要无论程序正常还是异常完成都设置 isRunning=false。

 

       这样就实现了前一次没执行完后面的任务不等待直接结束的效果。但这样有一个缺点,由于isRunning 是针对一个容器可见的,也就是一个虚拟机JVM,所以当定时任务采用分布式处理时,一台电脑上的isRunning = true对另一台电脑来说是无效的。这时要采用的办法就是将这个isRunning放入数据库。

 

          一般quartz有两种方式,一种是RAM方式,也就是内存方式。另外一种是数据库方式,就是配置等信息放入数据库。很显然,第一种方式在分布式环境下是无效的,因为一台电脑的定时任务配置只放在本机内存中,对其他电脑是不可见的。而数据库方式是支持分布式处理的。数据库处理时分布式的方式没实践过,但我觉得应该考虑并发 的问题,就是一条数据被两个不同的电脑同时在处理的情况。前面说的将isRunning标示放入数据库来判断是一种解决办法。但这样有一个缺点就是,对于同一任务,不能分布式的执行,即不能在电脑C1上执行A任务,又在一台电脑C2上执行A任务(但可以在一台电脑执行A B C任务,在另一台电脑执行 D E F任务)。当系统性能恰好在一个定时任务上时,比如A任务处理量太大,必须在多个电脑上执行时,怎么办呢?

 

              一般的定时任务都是取业务数据,执行一定逻辑,更新业务数据。那么可以在取业务数据后立即将数据改变为执行中状态,这样另外一个任务不会取到相同的业务数据来处理了。当执行完后,将执行中的状态从数据库去掉即可。这样的方法增加了一定的代码量,而且多增加了一些数据库更新操作(更新业务数据的标志)。相对于前面的单台电脑执行来说,要自己取舍。

                 

                 另外的一种方式就是将任务拆分。比如任务处理的业务数据分为A B C D四类,那么外面可以将任务拆分成四个,每台电脑执行其中的一个即可。这种方式相对于上面一种来说,没有多余的数据库更新操作,代码量也少些。但缺点就是也许 A B C D四类数据分布不均,导致一台电脑很忙,另一台电脑很闲。

            

 

分享到:
评论

相关推荐

    spring定时任务quartz.jar

    总的来说,"spring定时任务quartz.jar"是将Quartz集成到Spring项目中的一个关键组件,提供了丰富的定时任务管理和配置能力,帮助开发者构建高效、可靠的后台任务执行系统。通过深入理解和熟练运用Quartz,可以大大...

    spring多个定时任务quartz配置

    在Spring框架中,Quartz是一个强大的任务调度库,可以用于执行定时任务。本文将深入探讨如何在Spring中配置Quartz以实现多个定时任务。 首先,我们需要理解Quartz的基本概念。Quartz是一个开源的工作调度框架,它...

    spring整合java quartz实现动态定时任务的前台网页配置与管理

    在实际项目应用中经常会用到定时任务,可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间、频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quartz与spring的组合...

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

    在Spring框架中,Quartz是一个强大的任务调度库,可以用于执行定时任务。本文将深入探讨如何在Spring中配置多个Quartz定时任务,并结合`quartz.properties`文件进行详细讲解。 首先,我们需要理解Quartz的基本概念...

    spring+quartz动态定时任务创建 +mybatis

    在Spring中整合Quartz,我们可以利用Spring的管理能力,如bean的生命周期管理和事务管理,来更方便地创建和管理定时任务。 **Spring+Quartz动态定时任务创建** 将Spring与Quartz结合,我们可以方便地在运行时动态...

    spring之定时任务实现(spring-task和quartz等不同方式)

    Spring框架提供了一系列工具来支持定时任务的实现,其中包括Spring自带的`spring-task`模块和第三方的Quartz库。下面我们将详细探讨这两种方式以及如何通过注解和非注解的方式进行配置。 首先,`spring-task`是...

    spring定时任务关键jar包(齐全)

    本文将详细探讨Spring定时任务的关键知识点,并与提供的jar包列表关联。 首先,Spring定时任务主要依赖于`spring-context-support`模块,这个模块包含了处理定时任务所需的类和接口。在压缩包`lib`中,应该包含了这...

    spring3配置quartz定时任务

    本文将详细介绍如何在Spring 3中配置Quartz来实现定时任务。 首先,理解定时任务的基本概念。定时任务是在指定时间点或按照一定规律自动执行的任务,这在业务系统中非常常见,例如数据清理、报表生成等。Quartz提供...

    spring定时任务之Quartz

    需要注意的是,`ssh2Test`这个文件名可能与本主题无关,因为它是SSH2测试相关的,而SSH2通常指的是Secure Shell 2协议,用于远程访问和管理服务器,与Spring定时任务或Quartz不直接相关。如果需要了解更多关于SSH2的...

    Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查

    Spring框架结合Quartz库,提供了一种强大而灵活的方式来管理这些定时任务。本项目旨在演示如何利用Spring和Quartz从数据库中动态加载定时任务,并实现对它们的增删改查功能。以下是关于这个主题的详细知识讲解。 ...

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

    在这两种方式中,Spring框架提供了自己的定时任务工具Spring Task,以及与专业定时任务框架Quartz集成的能力。 首先,对于Java自带的定时任务实现,我们可以使用java.util.Timer和java.util.TimerTask类。Timer类...

    Spring + quartz 定时任务修改定时时间不重启服务

    Spring + quartz 定时任务修改定时时间不重启服务

    spring整合quartz定时任务调度

    Spring框架作为Java领域广泛使用的轻量级框架,提供了与第三方库Quartz的整合,使得开发者能够轻松地在Spring应用中实现复杂的定时任务调度。Quartz是一款开源的作业调度框架,支持丰富的调度策略,可以满足各种定时...

    spring quartz定时任务demo

    在Java开发中,Spring框架与Quartz库的结合使用能够帮助开发者实现强大的定时任务功能。本文将详细解析“spring quartz定时任务demo”这个项目,它提供了实现Java定时任务的实例,便于快速理解和应用。 首先,...

    spring定时任务实现

    本文主要探讨了Spring中实现定时任务的三种主要方法:Java的`java.util.Timer`、Quartz库以及Spring自身的Task调度器。 首先,Java的`java.util.Timer`是一个基础的定时任务工具,它可以按照设定的频率执行任务,但...

    Spring 定时任务源码(spring 三种定时任务的实现方式)

    在Spring框架中,定时任务是实现系统自动化运行关键任务的重要工具。Spring提供了多种方式来创建和管理定时任务,...在chapter13目录下的文件可能包含了这些源码示例,你可以逐一研究,加深对Spring定时任务的理解。

    spring定时任务依赖的jar包

    2. **依赖的jar包**:实现Spring定时任务,通常需要以下10个关键的jar包: - `spring-context`: 包含了Spring的核心功能,如依赖注入(DI),AOP,事件处理等,是实现定时任务的基础。 - `spring-context-support`: ...

    Quartz+spring定时任务demo

    在 "Quartz+spring定时任务demo" 中,我们首先需要了解如何配置和集成 Quartz 与 Spring。这通常包括以下步骤: 1. **引入依赖**:在项目中添加 Quartz 和 Spring 相关的 jar 包。描述中提到的 "1128266338845696....

    Spring整合Quartz后的简单定时任务示例

    本资源"Spring整合Quartz后的简单定时任务示例"提供了如何将这两者结合使用的实例,旨在帮助开发者实现基于Spring的定时任务功能。 首先,我们要理解Spring对定时任务的支持。Spring框架通过`@Scheduled`注解提供了...

    完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题

    在多应用服务器负载均衡环境下,Spring Quartz定时任务的重复执行问题是一个常见的挑战。Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,...

Global site tag (gtag.js) - Google Analytics