`

quartz 数据库可配置

    博客分类:
  • java
 
阅读更多

一、表设计:

DROP TABLE IF EXISTS `ma_quartz_info`;

CREATE TABLE `ma_quartz_info` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',

  `name` varchar(32) DEFAULT '' COMMENT '定时任务名称',

  `code` varchar(64) DEFAULT '' COMMENT '定时任务code标识',

  `cycle` varchar(32) DEFAULT '' COMMENT '定时任务执行周期',

  `class_name` varchar(64) DEFAULT '' COMMENT '定时任务执行类',

  `succeed` int(11) DEFAULT '0' COMMENT '成功执行次数',

  `fail` int(11) DEFAULT '0' COMMENT '失败执行次数',

  `state` varchar(2) DEFAULT '' COMMENT '是否启用 10启用 20禁用',

  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

  `init_data_url` varchar(100) DEFAULT NULL COMMENT '初始化数据url',

  PRIMARY KEY (`id`),

  KEY `name` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时任务信息表';

 

 

INSERT INTO ma_quartz_info(name, code, cycle, class_name, state, init_data_url) VALUES ('用户行为','applicantsBehavior','0 57 2 * * ?','com.jxl.manado.job.ApplicantsBehaviorJob','10','/manado/userAnalysis/deleteUserBehavior.api');

 

DROP TABLE IF EXISTS `ma_quartz_log`;

CREATE TABLE `ma_quartz_log` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',

  `quartz_id` bigint(20) DEFAULT NULL COMMENT '定时任务id',

  `start_time` datetime DEFAULT NULL COMMENT '启动时间',

  `time` int(11) DEFAULT '0' COMMENT '任务用时',

  `result` varchar(2) DEFAULT '' COMMENT '执行结果 10成功 20失败',

  `remark` varchar(128) DEFAULT '' COMMENT '备注信息',

  PRIMARY KEY (`id`),

  KEY `quartz_id` (`quartz_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时任务执行记录表';

 

(quartzInfoService 和 quartzInfoDao 略)

 

二、QuartzManager

@Service

public class QuartzManager {

 

//    private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();

    private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";

    private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";

    public static final Logger logger = LoggerFactory

            .getLogger(QuartzManager.class);

 

    @Autowired

    private Scheduler scheduler;

 

 

    /**

     * 添加一个定时任务

     *

     * @param jobName

     * @param time

     */

    public void addJob(String jobName,String jobClassName, String time) {

 

        try {

            Class jobClass = Class.forName(jobClassName);

//            Scheduler scheduler = gSchedulerFactory.getScheduler();

            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, JOB_GROUP_NAME).build();// 任务名,任务组,任务执行类

            // 触发器

            //表达式调度构建器

            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);

            //按新的cronExpression表达式构建一个新的trigger

            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME).withSchedule(scheduleBuilder).build();

            scheduler.scheduleJob(jobDetail, trigger);

            // 启动

            if (!scheduler.isShutdown()) {

                scheduler.start();

            }

        } catch (SchedulerException e) {

            logger.error(e.getMessage(), e);

        } catch (ClassNotFoundException e) {

            logger.error(e.getMessage(), e);

        }

    }

 

 

    /**

     * 修改一个任务的触发时间

     *

     * @param Jobname

     * @param time

     * @param time

     */

    public void modifyJobTime(String Jobname,String time) {

 

        try {

          //  Scheduler scheduler = gSchedulerFactory.getScheduler();

            TriggerKey triggerKey = TriggerKey.triggerKey(Jobname, TRIGGER_GROUP_NAME);

            //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"

            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

            if (trigger == null) {

                return;

            }

            String oldTime = trigger.getCronExpression();

            if (!oldTime.equalsIgnoreCase(time)) { //表达式调度构建器

                // 修改时间

                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);

                //按新的cronExpression表达式构建一个新的trigger

                 trigger = TriggerBuilder.newTrigger().withIdentity(Jobname, TRIGGER_GROUP_NAME).withSchedule(scheduleBuilder).build();

 

                // 重启触发器

                scheduler.rescheduleJob(triggerKey, trigger);

            }

        } catch (SchedulerException  e) {

            logger.error(e.getMessage(), e);

        }

 

    }

 

    /**

     * 移除一个任务(使用默认的任务组名,触发器名,触发器组名)

     *

     * @param jobName

     */

    public void removeJob(String jobName) {

 

        try {

//            Scheduler scheduler = gSchedulerFactory.getScheduler();

            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);

 

            scheduler.pauseTrigger(triggerKey);// 停止触发器

            scheduler.unscheduleJob(triggerKey);// 移除触发器

            scheduler.deleteJob(JobKey.jobKey(jobName, JOB_GROUP_NAME));// 删除任务

        } catch (SchedulerException e) {

            logger.error(e.getMessage(), e);

        }

 

    }

 

 

    /**

     * 立即执行任务(使用默认的任务组名,触发器名,触发器组名)

     *

     * @param jobName

     */

    public void startJobNow(String jobName) {

 

        try {

          //  Scheduler scheduler = gSchedulerFactory.getScheduler();

            scheduler.triggerJob(JobKey.jobKey(jobName, JOB_GROUP_NAME));

        } catch (SchedulerException e) {

            logger.error(e.getMessage(), e);

        }

 

    }

 

 

 

    /**

     * 启动所有定时任务

     */

    public void startJobs() {

 

        try {

            // Scheduler scheduler = gSchedulerFactory.getScheduler();

            scheduler.start();

        } catch (SchedulerException e) {

            logger.error(e.getMessage(),e);

        }

 

    }

 

    /**

     * 关闭所有定时任务

     */

    public void shutdownJobs() {

 

        try {

            // Scheduler scheduler = gSchedulerFactory.getScheduler();

            if (!scheduler.isShutdown()) {

                scheduler.shutdown();

            }

        } catch (SchedulerException e) {

            logger.error(e.getMessage(),e);

        }

 

    }

 

}

 

三、QuartzJobListener

public class QuartzJobListener extends QuartzInitializerListener {

    @Override

    public void contextInitialized(ServletContextEvent servletContextEvent) {

        super.contextInitialized(servletContextEvent);

        QuartzManager quartzManager = WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext()).getBean(QuartzManager.class);

        QuartzInfoService quartzInfoService = WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext()).getBean(QuartzInfoService.class);

 

        List<QuartzInfo> quartzInfoList = quartzInfoService.findAllUsedQuartzJobs();

        if(Detect.notEmpty(quartzInfoList)){

            for(QuartzInfo quartzInfo : quartzInfoList){

                quartzManager.addJob(quartzInfo.getCode(), quartzInfo.getClassName(), quartzInfo.getCycle());

            }

        }

    }

 

    @Override

    public void contextDestroyed(ServletContextEvent servletContextEvent) {

        super.contextDestroyed(servletContextEvent);

    }

}

 

 

分享到:
评论

相关推荐

    Quartz 数据库动态配置

    这就是“Quartz数据库动态配置”所解决的问题。 Quartz通过将作业(Jobs)和触发器(Triggers)的信息存储在数据库中,实现了配置的动态化。这样,我们可以在不重启应用的情况下,通过修改数据库中的表来添加、删除...

    定时器(quartz+spring)读取数据库配置

    通过这种方式,我们可以构建一个高度可扩展和可配置的定时任务系统,只需在数据库中修改Job和Trigger的配置,无需重启应用,就能动态调整任务的执行策略。这种方式特别适合大型分布式系统,可以实现任务的集中管理和...

    quartz数据库脚本

    标题中的“quartz数据库脚本”指的是Quartz为了适配多种数据库管理系统(DBMS)而提供的SQL脚本。这些脚本包含了创建和初始化Quartz所需表的命令,确保作业、触发器、作业细节等信息能够被正确存储和检索。 描述中...

    Springboot整合Quartz实现定时任务数据库动态配置

    本篇文章将详细探讨如何在Spring Boot项目中整合Quartz,并通过MySQL数据库实现定时任务的动态配置。 首先,我们需要在项目中添加依赖。在Spring Boot的`pom.xml`文件中,引入Spring Boot的`spring-boot-starter-...

    quartz-数据库建表语句.zip

    这一步是Quartz配置中的关键部分,确保Quartz能够正确地存储和检索作业和触发器信息,从而实现预定的调度功能。 为了保证Quartz与数据库的兼容性,这些SQL语句通常会按照特定的数据库方言编写,因此在使用前需要...

    quartz 持久化数据库表结构sql

    了解了Quartz的数据库表结构和配置后,你可以根据具体需求调整和优化这些脚本,以适应你的应用环境。同时,记得在生产环境中对这些表进行适当的备份和维护,确保Quartz的稳定运行。在使用Quartz过程中,务必熟悉其...

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

    2. **数据库配置**:由于我们选择了基于数据库的作业存储(job-store-type: jdbc),所以需要配置数据库连接信息,包括数据源和表前缀。 ```yaml datasource: url: jdbc:mysql://localhost:3306/quartz?useSSL=...

    quartz-2.3.0数据库表SQL.zip

    - 主要的Quartz数据库表包括`QRTZ_JOB_DETAILS`, `QRTZ_TRIGGERS`, `QRTZ_CRON_TRIGGERS`, `QRTZ_SIMPLE_TRIGGERS`, `QRTZ_BLOB_TRIGGERS`, `QRTZ_CALENDARS`, `QRTZ_PAUSED_TRIGGER_GRPS`, `QRTZ_FIRED_TRIGGERS`,...

    quartz 持久化数据库表

    Quartz是一款开源的作业调度框架...总的来说,Quartz的持久化数据库表是实现可靠定时任务调度的关键组成部分,它们提供了一种在系统崩溃或重启后能恢复任务调度的能力,使得Quartz成为许多企业级应用中不可或缺的工具。

    Quartz 2.2.2数据库表格脚本

    8. **tables_derby.sql**:Apache Derby是Java的开源数据库,此脚本确保Quartz在Derby上的配置。 9. **tables_pointbase.sql**:PointBase是一款小型、快速的数据库系统,这个脚本是为了在PointBase上设置Quartz。 ...

    spring 集成quartz 用数据库实现quartz的集群

    3. 配置`quartz.properties`,指定数据库连接和Quartz参数。 4. 设计并实现`Job`和`Trigger`,定义任务逻辑和执行时机。 5. 在集群环境中,确保所有节点连接到同一个数据库,并共享任务信息。 通过这种方式,我们...

    Quartz.net 3.0.7.0数据库持久化.rar

    这个压缩包“Quartz.net 3.0.7.0数据库持久化.rar”包含了关于如何使用Quartz.NET实现任务调度的数据库持久化和集群配置的资料。Quartz.NET 3.0.7.0是该库的一个稳定版本,它提供了许多改进和新特性。 **数据库持久...

    quartz各种数据库的建表语句

    - 配置Quartz的`org.quartz.dataSource`属性,指定数据库连接信息。 - 使用`org.quartz.plugin.triggHistory`插件可以记录触发器的历史信息。 - 定义任务类(实现`Job`接口)和触发器(如`CronTrigger`或`...

    Spingboot+Quartz基于数据库的作业任务调度

    2. **配置Quartz**:在`application.properties`或`application.yml`中配置Quartz,包括数据库连接信息、表名前缀、线程池大小等。这允许Quartz将任务和触发器存储在数据库中。 3. **创建Job和Trigger**:定义`Job`...

    关于spring中quartz的配置

    可以通过`quartz.properties`文件配置Quartz的一些全局参数,比如数据库连接、线程池大小等。例如: ``` org.quartz.scheduler.instanceName = MyScheduler org.quartz.jobStore.class = org.quartz.impl....

    quartz集群各种数据库建表脚本

    "quartz集群各种数据库建表脚本" 提供了在不同类型的数据库中创建Quartz集群所需的表结构。基于quartz2.2.1版本,这个脚本应该包含了创建必要的调度表,如QRTZ_JOB_DETAILS、QRTZ_TRIGGERS、QRTZ_SIMPLE_TRIGGERS等...

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

    这些方法需要更新数据库中的相应记录,并通知Quartz重新加载任务配置。 4. **部署与测试**:项目部署在Tomcat服务器上,当服务器启动时,Quartz会自动加载数据库中的定时任务。通过监控日志或者定制的监控界面,...

    Spring Quartz如何动态配置时间

    Spring Quartz 动态配置时间 Spring Quartz 是一个功能强大的任务调度框架,广泛应用于 Java 企业级应用程序中。其中一个重要的功能便是动态配置时间,触发相应的任务。在本文中,我们将讨论如何使用 Spring Quartz...

    quartz动态从数据库获取时间定时

    在"quartz动态从数据库获取时间定时"的场景中,我们可以理解为Quartz的任务执行时间不是硬编码在程序中,而是从数据库中动态获取,这提供了更大的灵活性和可配置性。 首先,让我们来详细了解一下Quartz的核心概念:...

    quartz实例sqlserver数据库连接

    在“quartz实例sqlserver数据库连接”这个主题中,我们主要讨论如何配置Quartz与SQL Server数据库进行交互,以存储和管理调度信息。 首先,Quartz需要一个持久化存储来保存作业(Jobs)和触发器(Triggers)的信息...

Global site tag (gtag.js) - Google Analytics