`

Spring整合Quartz实现持久化、动态设定时间

    博客分类:
  • Java
 
阅读更多

一、spring整合

  网上一搜有很多整合的方式,这里我采用了其中的一种(暂时还没有对其他的方法研究过)。

  对于spring的整合其中的任务,spring提供了几个类、接口(这些类都实现了Job接口):

  org.springframework.scheduling.quartz.QuartzJobBean

  org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.MethodInvokingJob 

  org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob

  

  QuartzJobBean和MethodInvokingJob是无状态的,StatefulMethodInvokingJob是有状态的。

  可以选择自己的需求选择继承与哪个类。 

  关于Scheduler在Spring上的配置:

复制代码
    <bean name="quartzScheduler" lazy-init="false"
          class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
        <property name="dataSource">  
            <ref bean="dataSource" />  
        </property> 
        
        <property name="applicationContextSchedulerContextKey"  
                    value="applicationContextKey" /> 
         <property name="autoStartup" value="true" />
        <property name="configLocation" value="classpath:spring/quartz.properties"/> 
    </bean> 
复制代码

  注意:其中lazy-init="false",和 <property name="autoStartup" value="true"/>最好按照自己的需求作统一的配置

二、quartz.properties 配置持久化的信息

复制代码
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#============================================================================
# Configure JobStore
#============================================================================
#org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.useProperties = true
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#havent cluster spring
#org.quartz.jobStore.dataSource = myDS 
org.quartz.jobStore.tablePrefix = qrtz_
org.quartz.jobStore.isClustered = false  
org.quartz.jobStore.maxMisfiresToHandleAtATime=1
#==============================================================  
#Non-Managed Configure Datasource  if you don't use spring cluster
#==============================================================   
#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver   
#org.quartz.dataSource.myDS.URL = jdbc\:mysql\://localhost\:3306/qrtz  
#org.quartz.dataSource.myDS.user = root   
#org.quartz.dataSource.myDS.password = root 
#org.quartz.dataSource.myDS.maxConnections =10  
复制代码

  这里要备注的是:org.quartz.jobStore.misfireThreshold = 60000

  这个属性是配置当发现触发器过时,允许做就之内的trigger任有效。对于详细了解其中的机制,可以查看数据库的变化,特别是数据库中的QRTZ_FIRED_TRIGGERS表。

  对于其状态有ACQUIRED和EXECUTING两个状态进行转化,并因此会影响QRTZ_TRIGGERS的表的数据。(个人猜想:quartz是利用这几个字段来保存断点的)

三、下面是项目的搭建代码:

  任务类信息类JobModel  

复制代码
public class JobModel {
    private String jobName; 
    private String group;//对于job,trigger相互绑定的,采用相同的group 
    private Class<?> jobClass;
    private Trigger trigger;
    public JobModel() {
        super();
    }
        //.....getter,setter   
}
复制代码

  定义一个无状态的Job(若定义一个有状态的Job,需要继承与StatefulMethodInvokingJob)

复制代码
public class CommonJob extends MethodInvokingJob{
    @Override
    protected void executeInternal(JobExecutionContext context)
            throws JobExecutionException {
        System.out.println("commonJob executing ...");
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        int value = Integer.parseInt(dataMap.getString("key"));
        System.out.println("value is " + value);
        dataMap.put("key", new Integer(++value).toString());
        
    }
}
复制代码

  SchedulerManager一共对在scheduler中操作job

复制代码
public class QrtzManager {
    private static Scheduler scheduler;
    static {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext-quartz2.xml");
        scheduler = (StdScheduler) context.getBean("quartzScheduler");
    }
    public void standBy(){
        try {
            scheduler.standby();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    //add a job
    public void deploy(JobModel model,JobDataMap dataMap){
        JobDetail jobDetail = new JobDetail(model.getJobName(),model.getGroup(),model.getJobClass());
        jobDetail.setJobDataMap(dataMap);
        try {
            scheduler.scheduleJob(jobDetail,model.getTrigger());
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    //delete a job
    public void unDeploy(String jobName,String group){
        if (jobName.equals("") || group.equals("")) {
            return ;
        }
        try {
            scheduler.deleteJob(jobName, group);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        
    }
}
复制代码

测试类

复制代码
package com.lps.schedulerserver.service02;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Test;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;

public class Main {
    public static void main(String[] args) {
    
        Trigger trigger = new SimpleTrigger("trigger02", "group02", new Date(), parse("2012-12-12 18:30:00"), 5, 10000L);
        JobModel model1 = new JobModel("job01", "group01", CommonJob.class, trigger);
        String expression = "0/15 * * ? * *";
        Trigger trigger2 = null;
        try {
            trigger2 = new CronTrigger("trigger01", "group", expression);
            trigger2.setStartTime(new Date());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        JobModel model2 = new JobModel("job02","group02",StatefulJob.class,trigger2);
        QrtzManager manager = new QrtzManager();
        //jobdatamap
        JobDataMap dataMap = new JobDataMap();
        dataMap.put("key", "1");
        manager.deploy(model2, dataMap);
        System.out.println("deploy model2 at:"+new Date());
    }
    public static Date parse(String str){
        DateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
        Date date = null ;
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    @Test
    public void deleteJob(){
        QrtzManager manager = new QrtzManager();
        manager.unDeploy("job01","group01");
    }
}
复制代码

 

分享到:
评论

相关推荐

    SSM整合quartzb并持久化到数据库实现动态增删改查

    通过以上步骤,我们可以构建一个完整的SSM整合Quartz的系统,实现了定时任务的动态管理,并将所有信息持久化到数据库,提高了系统的可维护性和扩展性。这个系统对于需要定时执行任务的项目来说,提供了极大的便利。

    spring+quartz实现动态设置定时任务

    4. **数据持久化**:如果使用数据库存储任务和触发器,Quartz会提供相应的SQL脚本。在【描述】中提到的"sql语句"可能就是这些脚本,用于创建Quartz所需的表结构。通过这种方式,任务的配置可以在多个应用服务器之间...

    spring整合quartz文档

    2. **持久化**:Quartz 提供了调度状态的持久化功能,确保即使系统崩溃,任务调度信息也不会丢失。 3. **组件化**:它包含一系列的侦听器、插件和线程池,允许扩展和定制以满足特定需求。 4. **Job 和 Trigger**:...

    spring整合quartz使用jdbc存储

    Spring整合Quartz是一款高效的任务调度框架,用于在Java应用程序中定时执行特定任务。Quartz本身支持多种持久化策略,包括使用数据库(JDBC)来存储作业和触发器信息,这使得任务调度信息在系统重启后仍能保留。下面...

    springboot整合quartz定时任务yml文件配置方式

    在Spring Boot应用中整合Quartz定时任务是一种常见的需求,它可以帮助我们执行周期性的后台任务,如数据同步、报表生成等。Spring Boot与Quartz的结合提供了便捷的配置方式,特别是通过YAML(YAML Ain't Markup ...

    spring+quartz动态设置定时时间

    总之,通过Spring与Quartz的整合,我们可以实现动态的定时任务管理,这在实际业务中非常有用。无论是通过API动态调整,还是利用数据库存储,都能满足不同场景的需求。同时,了解和掌握各个版本间的兼容性以及最佳...

    spring+quartz使用jar包

    4. **JobDetailBean**:这个bean用于定义Job的具体实现,包括Job类的引用、Job的数据绑定以及是否持久化等属性。 5. **CronTriggerBean**:它用于定义触发Job执行的Cron表达式,这允许我们根据预定义的时间模式(如...

    Quartz2.0持久化到数据库

    在持久化到数据库的情况下,应设置为`org.quartz.impl.jdbcjobstore.JobStoreTX`或`org.quartz.impl.jdbcjobstore.StdJDBCDelegate`。同时,要指定表前缀,如: ``` org.quartz.jobStore.tablePrefix=QRTZ_ org....

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

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

    Spring-quartz实现定时器(含代码)

    本文将深入探讨如何使用Spring整合Quartz来实现定时器,并提供相关代码示例。 首先,理解Spring框架。Spring是一个开源的Java平台,它提供了全面的企业级应用程序开发解决方案,包括依赖注入(DI)、面向切面编程...

    spring整合quartz定时发送邮件

    Spring整合Quartz定时发送邮件涉及到的关键技术点有: 1. 使用Apache Commons Email库进行邮件发送。 2. 创建Quartz Job,继承Spring提供的`QuartzJobBean`,并在`executeInternal()`方法中执行实际任务。 3. 在...

    springboot整合mybatis+quartz实现任务持久化

    在本项目"springboot整合mybatis+quartz实现任务持久化"中,我们将讨论如何将这三个技术有效地集成,以实现高效、可靠的定时任务管理。 首先,Spring Boot的整合通常涉及添加依赖。在`pom.xml`或`build.gradle`文件...

    Spring整合Quartz定时任务实例

    在Spring 4.2.1.RELEASE版本中,整合Quartz的过程主要涉及以下几个步骤: 1. **添加依赖**:首先,你需要在项目的`pom.xml`文件中引入Spring和Quartz的依赖。确保版本号与描述中提到的相符,这通常会确保兼容性。 ...

    spring quartz 整合示例

    它的强大之处在于灵活的调度规则设置和强大的持久化能力。 接下来,我们看看标题中的"spring quartz 整合示例"。Spring框架提供了一种方便的方式来管理和配置Quartz。通过Spring的XML配置或注解方式,我们可以轻松...

    SSH+quartz实现的可动态配置时间规则的定时任务

    SSH+quartz实现的可动态...它利用Spring的DI和AOP,Struts的MVC,Hibernate的数据持久化,以及Quartz的灵活调度能力,实现了对定时任务的全面管理和控制。这样的系统对于企业的日常运营和自动化工作流有着重要的价值。

    quartz整合springbatch定时集群实现mysql参考模版

    **整合Quartz和SpringBatch** 将Quartz与SpringBatch整合,可以利用Quartz的定时功能触发SpringBatch的任务执行。首先,你需要在Spring配置中声明一个QuartzScheduler,并设置JobStore类型为支持集群的JDBCJobStore...

    springquartz源码

    Spring Quartz 是一个强大的任务调度框架,它允许开发者在Spring应用中轻松地定义和执行定时任务。Quartz 是一个开源的作业调度框架,而Spring通过Spring Quartz模块提供了与Quartz的集成,使得在Java环境中管理定时...

    spring整合quartz

    总结来说,Spring整合Quartz涉及到Spring上下文的配置、Quartz的Job和Trigger定义,以及持久化和集群的设置。通过这样的整合,你可以轻松地在Spring应用中管理复杂的定时任务,同时保证任务的可靠性和可扩展性。

    Spring+quartz相关jar包.rar

    2. 配置 Scheduler:在 Spring 配置文件中,设置 Quartz 的 SchedulerFactoryBean,指定数据库存储(如果需要持久化任务信息)和相关的配置属性。 3. 定义 Job 和 Trigger:创建 Quartz 作业类(Job),实现 org....

    Spring3整合Quartz 2实现定时任务

    本文将深入探讨如何在Spring 3中整合Quartz 2来实现灵活、可扩展的定时任务系统。 首先,我们要了解Spring 3与Quartz 2的基本概念。Spring 3是Spring框架的一个版本,它提供了诸如依赖注入、面向切面编程、数据访问...

Global site tag (gtag.js) - Google Analytics