`
vakin.jiang
  • 浏览: 147541 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

简单修改quartz支持动态修改执行时间和集群架构

    博客分类:
  • J2EE
 
阅读更多

推荐一个开源免费java分布式开发框架:  http://www.jeesuite.com/

需求:

1.可以通过数据库配置cronExpression表达式,动态修改执行时间

2.不修改服务器环境支持集群架构:即保证集群环境下单实例运行

3.实现业务上的实时开启/停止控制功能

 

第一步:建立数据表

create table SCHEDULER_CONF
(
  TRIGGER_NAME   VARCHAR2(64) not null,
  SCHEDULER_NAME VARCHAR2(100) not null,
  CRON_EXPR      VARCHAR2(64) not null,
  STATUS         CHAR(1) not null,--激活状态
  RUN_STATUS     CHAR(1),--当前运行状态
  CONSTRAINT "T_PK" PRIMARY KEY ("TRIGGER_NAME")
)

 第二步:实现基础控制类

public abstract class BaseSchedulerBean {
    
    private String triggerName;
    
    protected static Scheduler scheduler;
    protected static JdbcTemplate jdbcTemplate;
    
    protected static JdbcTemplate getJdbcTemplate() {
        if(jdbcTemplate == null){
            jdbcTemplate = InstanceFactory.getInstance(JdbcTemplate.class);
        }
        return jdbcTemplate;
    }

    public static Scheduler getScheduler() {
        if(scheduler == null)scheduler = InstanceFactory.getInstance(Scheduler.class);
        return scheduler;
    }
    
   
    public void setTriggerName(String triggerName) {
        this.triggerName = triggerName;
    }

    public synchronized void execute(){
        try {
            String latestConExpr = checkExecutable(triggerName);
            if(latestConExpr == null)return;
            
            updateExecutable(true); 
            
            doJob();
            
            checkConExpr(latestConExpr);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            updateExecutable(false); 
        }
        
    }
    
    public void checkConExpr(String latestConExpr) {
        try {
            //check cronExpr valid
            CronTriggerBean trigger = (CronTriggerBean) getScheduler().getTrigger(
                    triggerName, Scheduler.DEFAULT_GROUP);
            String originConExpression = trigger.getCronExpression();
            //判断任务时间是否更新过
            if (!originConExpression.equalsIgnoreCase(latestConExpr)) {
                trigger.setCronExpression(latestConExpr);
                getScheduler().rescheduleJob(triggerName, Scheduler.DEFAULT_GROUP, 
                        trigger);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
       
    }
    
    /**
     * 检测当前是否可用:激活状态=Y,运行状态=N<br>
     * generate by: vakin jiang
     *                    at 2012-2-13
     * @return
     */
    protected String checkExecutable(String triggerName){
        String conExpr = null;
        try {
            SqlRowSet rs = getJdbcTemplate().queryForRowSet("SELECT CRON_EXPR FROM SCHEDULER_CONF WHERE STATUS='Y' and RUN_STATUS='N' and TRIGGER_NAME='"+triggerName+"'");
            if(rs.next()){
                conExpr = rs.getString("CRON_EXPR");
            }
        } catch (Exception e) {}
        return conExpr;
    }
    
    /**
     * 更新运行状态<br>
     * generate by: vakin jiang
     *                    at 2012-2-13
     * @param runing
     */
    protected void updateExecutable(boolean runing){
        String status = runing ? "Y" :"N";
        String sql = "UPDATE SCHEDULER_CONF set RUN_STATUS='"+status+"' WHERE TRIGGER_NAME='"+triggerName+"'";
        getJdbcTemplate().execute(sql); 
    }
    
    public abstract void doJob();
    
}

 

以上两步就已经完成,下面就可以直接用了

public class DemoScheduler extends BaseSchedulerBean {
    /*
     *@see com.csair.scms.infrastructure.extend.quartz.BaseSchedulerBean#doJob()
     */
    @Override
    public void doJob() {
        //do something
    }
}

 

ps:spring配置可不做任何修改,当然也可以通过重写简化配置

      InstanceFactory为一个我们自己写好的spring实例工厂

 

 

1
0
分享到:
评论

相关推荐

    Quartz定时器从入门到进阶

    总的来说,Quartz是一个强大的任务调度框架,它提供了一套全面的API和工具,使得开发者可以轻松创建和管理定时任务,无论是简单的单次执行还是复杂的调度场景,Quartz都能胜任。通过学习和掌握Quartz,开发者能够为...

    Quartz任务调度器

    同时,Quartz提供了丰富的API和插件系统,可以进行更复杂的任务调度,如暂停、恢复、删除任务,以及动态修改任务执行策略等。 总的来说,Quartz任务调度器与Spring的整合使得我们能够在应用中轻松地实现定时任务的...

    quartz-1.8.5.tar.gz

    Quartz 是一个开源的工作调度框架,它允许程序员和系统管理员安排任务在特定的时间点或按照预定义的周期执行。在Java开发中,Quartz 被广泛应用,因为它提供了丰富的功能和高度的灵活性,使得定时任务的管理变得简单...

    quartz的jar包和配置文件

    3. **多线程与集群支持**:Quartz可以在多个线程甚至多台服务器上同时运行,提供高可用性和负载均衡。 4. **插件友好**:Quartz提供了一个插件架构,允许开发者轻松扩展其功能,如监控、邮件通知等。 5. **丰富的...

    ssm框架+quartz2.2Jar包

    Quartz支持CRON表达式、触发器、作业和集群等多种功能,使得在Java应用中实现复杂的定时任务变得非常方便。 在SSM框架中集成Quartz,通常的做法是: 1. **配置Spring**:在Spring的配置文件中添加Quartz的配置,...

    Java作业调度之Quartz

    Quartz是开源的Java作业调度框架,它允许开发人员安排任务在特定的时间点运行。在企业级应用中,任务调度是一个关键功能,例如定时执行数据备份、发送邮件通知或者定期执行批处理任务。Quartz通过提供灵活的API,...

    maven ssh+ quartz + zookeeper 实现分布式任务调度的管理界面

    - Quartz定时器按照预定的时间间隔触发任务,同时Zookeeper确保任务在集群中的正确分发和执行。 - Zookeeper提供服务注册和发现,使得任务调度器能够找到并调用其他服务。 这个开源项目提供的管理界面可以帮助用户...

    spring4+hibernate5+quartz2+hdfs整合

    Quartz 2 提供了更稳定、更健壮的调度功能,支持集群环境,可以在分布式系统中协调任务执行。它可以用来安排任务的触发,如定时发送邮件、执行数据清理等。Quartz 2 的API允许开发者方便地创建、修改和删除作业及...

    架构师系列-定时任务解决方案

    Quartz 提供了丰富的调度功能,如定时触发、触发器、作业、集群支持等。开发者可以通过定义 Job 类来封装任务逻辑,并使用 Trigger 来配置执行时机。 Spring Framework 自从 3.0 版本起,引入了 TaskExecution 和 ...

    XXL-JOB架构图.pptx

    14. **分片任务(Sharding Tasks)**:从v2.0.0开始,XXL-JOB引入了分片任务的概念,允许任务被拆分成多个子任务,协同处理大数据量的工作,支持动态扩容和分片参数的设定,增强了处理大规模数据的能力。 15. **Time...

    springbootQuartz

    在实际项目中,还可以进一步扩展,例如实现任务的动态添加、删除,或者使用监控工具如`rr-quartz-monitor`对Quartz集群进行监控,确保定时任务的稳定运行。 总结起来,SpringBoot+Quartz的集成为我们提供了高效、可...

    分布式任务调度系统调研

    2. **动态任务管理**:虽然支持修改现有任务的参数,但对于新任务的动态添加和支持分片等功能仍有待增强。 #### LTS(light-task-scheduler) **概述** LTS是一个轻量级的任务调度框架,用于解决分布式环境下的任务...

    毕设项目基于SpringBoot+Vue的轻量级定时任务管理系统源码+数据库+项目说明(含前端+后端).zip

    8. 动态控制:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效; 9. 执行策略:支持丰富的执行策略,包括:Get请求、PostJson请求、PostFrom表单请求; 10. 自动注册:周期性自动注册任务, 同时...

    企业后台管理基础框架 hsweb.zip

    脚本管理: 动态脚本,支持javascript,groovy,java动态编译执行.表单管理: 动态表单,可视化设计表单,自动生成数据库以及系统权限.无需重启直接生效.模块设置: 配合动态表单实现表格页,查询条件自定义.数据库维护: 在线...

    xxl-job-master

    它提供了易用的Web界面来管理和执行任务,支持多种任务执行器,并且具有高可用、分布式、可扩展的特点。让我们深入了解一下这个Java定时任务框架的核心功能和实现原理。 1. **分布式调度** XXL-JOB采用主从分布式...

    xxl-job-master.zip

    它基于Quartz Scheduler实现,可以配置CRON表达式定义任务执行的时间规则,并支持任务的分组、触发状态、日志查看等管理功能。 2. **执行器(XXL-JOB-EXECUTOR)**:执行器是实际执行任务的模块,每个执行器都可以...

    定时调度器 xxl-job

    4. **扩展性**:xxl-job支持动态扩缩容,可以根据业务需求增加或减少执行器实例,而无需修改代码或配置。 - **负载均衡**:任务会按照一定的策略均匀分发到各个执行器,避免单个执行器压力过大。 - **弹性伸缩**:...

    XXL-JOB XXL-JOB XXL-JOB

    2. 定时触发:预设时间点自动执行,支持CRON表达式,可实现复杂的定时策略。 3. 依赖触发:任务A完成后再触发任务B,实现任务间的逻辑关联。 四、任务调度策略 XXL-JOB提供了多种调度策略,包括单机、轮询、广播等...

    基于数据挖掘的决策支持系统的应用研究.pdf

    设计中提到,当集群中的服务器数量发生改变时,如新服务器的加入,主服务器会自动发起分组信息的修改,以重新计算分组信息,并将最新的分组信息同步给所有集群服务器,从而确保集群能够持续高效地工作。 在分布式重...

    SpingBoot集成ElaticJob定时器

    ElasticJob是由当当网开源的一个分布式任务调度框架,它结合了 Quartz 和 ZooKeeper,提供了分布式任务的注册、分配、执行以及监控等功能。而SpringBoot作为一个轻量级的Java开发框架,广泛应用于快速构建微服务应用...

Global site tag (gtag.js) - Google Analytics