`

Quartz定时作业管理

阅读更多

 public abstract class BaseJob {

    /**
     * 
     */
    private static final long serialVersionUID = -750342144932125596L;

    public BaseJob() {
    }

    private Job job = new Job();

    public Job getJob() {
        return job;
    }

    public void setJob(Job job) {
        this.job = job;
    }

    private Scheduler scheduler;

    // 通过setter方法传入被调用者的实例scheduler
    public void setScheduler(Scheduler scheduler) {
        this.scheduler = scheduler;
    }

    public Scheduler getScheduler() {
        return scheduler;
    }

    public void reScheduleJob() throws SchedulerException, ParseException {

        MyCronTrigger trigger = (MyCronTrigger) this.getScheduler().getTrigger(
                this.getJob().getTriggerName(), Scheduler.DEFAULT_GROUP);
        this.setJob(trigger.getScheduleInfoManager().queryJobInfo(this).getJob());

        // 如果job表中的status!=P 就不启动这个job
        if (!this.getJob().getStatus().equalsIgnoreCase("P")) {
            this.getScheduler().pauseJob(this.getJob().getName(), Scheduler.DEFAULT_GROUP);
            return;
        } else {
            this.getScheduler().resumeJob(this.getJob().getName(), Scheduler.DEFAULT_GROUP);
        }

        // ConExpressionTransfer.convertDateToCro nExp(everyWhat, commonNeeds, monthlyNeeds,
        // weeklyNeeds, userDefinedNeeds);

        System.out.println("首次时间 >>>> " + trigger.getOrigTime());// 初始

        String lastCronExpression = trigger.getCronExpression(); // 上次时间
        System.out.println("上次时间 >>>> " + lastCronExpression);

        String newCronExpression = this.getJob().getRuntime();// 新时间
        System.out.println("新时间   >>>> " + newCronExpression);

        if (!lastCronExpression.equalsIgnoreCase(newCronExpression)) {
            System.out.println(" ..时间有变化...从  " + lastCronExpression + " 到 " + newCronExpression);
            System.out.println(" 重置 CronExpression ");
            trigger.setCronExpression(newCronExpression);
            this.getScheduler().rescheduleJob(this.getJob().getTriggerName(),
                    Scheduler.DEFAULT_GROUP, trigger);
        } else {
            // 下面是执行具体的job内容
            System.out.println(" ..时间没有变化...");
            this.execute();
        }
    }

    public abstract void execute();
}

 

public class PrintJob extends BaseJob {

    public PrintJob() {
        super();
        this.getJob().setTriggerName("printJobTrigger");
        JobRegistry.registerJob(this);
    }

    @Override
    public void execute() { // 执行入口函数
        // 业务逻辑
        System.out.println("PrintJOB over = " + DateTimeUtil.currentTime());
        System.out.println(JobRegistry.getJob("printJobTrigger").getJob().getTriggerName());
    }

}

 

所有要执行的job都必须来这里注册
public class JobRegistry {

    /*
     * Map<jobTriggerName,BaseJob>
     */
    private static Map<String, BaseJob> jobMap = new HashMap<String, BaseJob>();

    public static void registerJob(BaseJob job) {
        jobMap.put(job.getJob().getTriggerName(), job);
    }

    public static BaseJob getJob(String triggerName) {
        return jobMap.get(triggerName);
    }
}

 

public class MyCronTrigger extends CronTriggerBean {

    private BaseJob job;
    public BaseJob getJob() {
        return job;
    }

    public void setJob(BaseJob job) {
        this.job = job;
    }

    private ScheduleInfoManager scheduleInfoManager;

    public ScheduleInfoManager getScheduleInfoManager() {
        return scheduleInfoManager;
    }

    // 设值注入,通过setter方法传入被调用者的实例scheduleInfoManager
    public void setScheduleInfoManager(ScheduleInfoManager scheduleInfoManager) {
        System.out.println("InitializingCronTrigger.........");

        this.scheduleInfoManager = scheduleInfoManager;
        String cronExpression = scheduleInfoManager.queryJobInfo(job).getJob().getRuntime();
        this.origTime = cronExpression;
        try {
            System.out.println(cronExpression);
            setCronExpression(cronExpression);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    private String origTime;

    public String getOrigTime() {
        return origTime;
    }
    /**
     * @param origTime the origTime to set
     */
    public void setOrigTime(String origTime) {
        this.origTime = origTime;
    }
}

 

 /**
     * 获取任务时间
     * 
     * @return
     */
    protected String getRuntime() {

        HttpServletRequest request = ServletActionContext.getRequest();
        String everyWhat = request.getParameter("everyWhat");
        if ("Immediate Processing".equals(everyWhat)) {
            System.out.println("立即执行。。。。");
            String time = new SimpleDateFormat("HH:mm:ss").format(new Date());
            String[] commonNeeds = { time.split(":")[2], time.split(":")[1], time.split(":")[0] };
            String userDefinedNeeds = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
            String[] monthlyNeeds = { request.getParameter("week"),
                request.getParameter("dayOfWeek") };
            String weeklyNeeds = (String) request.getParameter("dayOfWeek");
            cronExpression = CronExpConversion.convertDateToCronExp(everyWhat, commonNeeds,
                    monthlyNeeds, weeklyNeeds, userDefinedNeeds);
        } else {
            String time = request.getParameter("time");
            String[] commonNeeds = { time.split(":")[2], time.split(":")[1], time.split(":")[0] };
            String[] monthlyNeeds = { request.getParameter("week"),
                request.getParameter("dayOfWeek") };
            String weeklyNeeds = (String) request.getParameter("dayOfWeek");
            String userDefinedNeeds = request.getParameter("date");
            cronExpression = CronExpConversion.convertDateToCronExp(everyWhat, commonNeeds,
                    monthlyNeeds, weeklyNeeds, userDefinedNeeds);
        }
        return cronExpression;
    }

 

public class CronExpConversion {

    /**
     * 页面设置转为UNIX cron expressions 转换算法
     * 
     * @param everyWhat
     * @param commonNeeds 包括 second minute hour
     * @param monthlyNeeds 包括 第几个星期 星期几
     * @param weeklyNeeds 包括 星期几
     * @param userDefinedNeeds 包括具体时间点
     * @return cron expression
     */
    public static String convertDateToCronExp(String everyWhat, String[] commonNeeds,
                                              String[] monthlyNeeds, String weeklyNeeds,
                                              String userDefinedNeeds) {
        String cronEx = "";
        String commons = commonNeeds[0] + " " + commonNeeds[1] + " " + commonNeeds[2] + " ";
        String dayOfWeek = "";
        if ("weekly".equals(everyWhat)) {
            dayOfWeek = weeklyNeeds; // 1
            if (dayOfWeek != null) {
                cronEx = (commons + CronExRelated.specialCharacters.get(CronExRelated._ANY) + " "
                        + CronExRelated.specialCharacters.get(CronExRelated._EVERY) + " "
                        + dayOfWeek + " ").trim();
            } else {
                cronEx = (commons + CronExRelated.specialCharacters.get(CronExRelated._ANY) + " "
                        + CronExRelated.specialCharacters.get(CronExRelated._EVERY) + " "
                        + CronExRelated.specialCharacters.get(CronExRelated._EVERY) + " ").trim();
            }
        } else if ("Daily".equals(everyWhat)) {
            cronEx = (commons + CronExRelated.specialCharacters.get(CronExRelated._ANY) + " "
                    + CronExRelated.specialCharacters.get(CronExRelated._EVERY) + " "
                    + CronExRelated.specialCharacters.get(CronExRelated._EVERY) + " ").trim();
        } else {// 立即执行--将定时任务的时间设置为当前时间
            String dayOfMonth = userDefinedNeeds.split("-")[2];
            if (dayOfMonth.startsWith("0")) {
                dayOfMonth = dayOfMonth.replaceFirst("0", "");
            }
            String month = userDefinedNeeds.split("-")[1];
            if (month.startsWith("0")) {
                month = month.replaceFirst("0", "");
            }
            String year = userDefinedNeeds.split("-")[0];
            // FIXME 暂时不加年份 Quartz报错
            /*
             * cronEx = (commons + dayOfMonth + " " + month + " " +
             * CronExRelated.specialCharacters.get(CronExRelated._ANY) + " " + year).trim();
             */
            cronEx = (commons + dayOfMonth + " " + month + " "
                    + CronExRelated.specialCharacters.get(CronExRelated._ANY) + " ").trim();
        }
        System.out.println(cronEx);
        return cronEx;
    }
}

 

public class CronExRelated {
    public static final String _EVERY = "every";
    public static final String _ANY = "any";
    public static final String _RANGES = "ranges";
    public static final String _INCREMENTS = "increments";
    public static final String _ADDITIONAL = "additional";
    public static final String _LAST = "last";
    public static final String _WEEKDAY = "weekday";
    public static final String _THENTH = "theNth";
    public static final String _CALENDAR = "calendar";

    public static final String _TYPE = "type";

    /**
     * 0 0 6 ? * 1#1 ? monthly; 0 0 6 ? * 1 ? weekly; 0 0 6 30 7 ? 2006 useDefined
     */
    static String[] headTitle = { "TYPE", "SECONDS", "MINUTES", "HOURS", "DAYOFMONTH", "MONTH",
        "DAYOFWEEK", "YEAR" };

    /**
     * cron expression special characters Map specialCharacters
     */
    public static Map specialCharacters;

    static {
        specialCharacters = new HashMap(10);
        specialCharacters.put(_EVERY, "*");// * 代表任意合法的字段
        specialCharacters.put(_ANY, "?");// ? 表示没值被指定 ,只能出现在月和星期的字段
        specialCharacters.put(_RANGES, "-");// - 表示值的范围
        specialCharacters.put(_INCREMENTS, "/");// / 表示时间的增量
        specialCharacters.put(_ADDITIONAL, ",");// 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发
        specialCharacters.put(_LAST, "L");// L 如果用在"一月哪天"段上,表示一个月的最后一天;如果用在"星期"段上。表示一个星期的最后一天(星期六)
        specialCharacters.put(_WEEKDAY, "W");// W 表示最靠近给定时间的一天,(必须是星期一到星期五)
        specialCharacters.put(_THENTH, "#");// 只能出现在"星期"段位置 ,表示第几个星期
        specialCharacters.put(_CALENDAR, "C");

        specialCharacters.put(_TYPE, headTitle);
    }

    public static void set(String ex, int index) {
        ((String[]) specialCharacters.get(_TYPE))[index] = ex;
    }
}

 

public class ScheduleInfoManager extends JpaDaoSupport {

    //把资源表中所有数据载入
    public BaseJob queryJobInfo(BaseJob baseJob){
        //String sql = "select * from JOB where TriggerName='"+ baseJob.getJob().getTriggerName() +"' and status='P'";
        String sql = "select * from JOB where TriggerName='"+ baseJob.getJob().getTriggerName() +"'";
        Query query = this.getEntityManager().createNativeQuery(sql,Job.class);
        
        //执行查询,返回的是查询的集合        
        @SuppressWarnings("unchecked")
        List<Job> jobList = query.getResultList();
        baseJob.setJob(jobList.get(0));
        System.out.println(jobList.get(0));
        return baseJob;
    } 
}

 

    /**
     * 将页面设置的时间转换为Quartz需要的时间格式并启动任务
     * 
     * @return
     */
    public String setTaskTime() {
        // 格式化后quartz的时间
        cronExpression = getRuntime();
        // 根据id获取job
        job = jobService.selectByID(Job.class, job.getId());
        // 修改job的运行时间
        job.setRuntime(cronExpression);
        // 更新job
        jobService.update(job);
        System.out.println("启动任务。。。");
        BaseJob baseJob = JobRegistry.getJob(job.getTriggerName());
        try {
            baseJob.reScheduleJob();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(cronExpression);
        return null;
    }

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<context:annotation-config/>

	<bean id="scheduleInfoManager" class="cn.com.acca.sas.jobManager.app.service.ScheduleInfoManager"></bean>
	 
    <bean id="printJob" class="cn.com.acca.sas.jobManager.app.job.PrintJob">
    	<property name="scheduler" ref="printJobScheduler" />
    </bean>

	<bean id="printJobInvoke" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	    <property name="targetObject" ref="printJob"/>
        <property name="targetMethod" value="reScheduleJob"/>  
        <property name="concurrent" value="false" />
	</bean>

	<bean id="printJobTrigger" class="cn.com.acca.sas.jobManager.app.service.MyCronTrigger"> 
		<property name="job" ref="printJob" /> 
        <property name="jobDetail" ref="printJobInvoke" />
        <property name="scheduleInfoManager" ref="scheduleInfoManager"/>
	</bean>
	
	<bean id="printJobScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
           <list>
                <ref local="printJobTrigger" />
           </list>
        </property>
    </bean>	
    
    
    
    <!-- 触发器将告诉Quartz两件事:在何时触发任务、触发哪个任务。
    	 cronExpression为调度时间,格式和unix上的crontab类似:"0-5 10,44 14 ? 3 5 2012" 2012年3月某日的星期五14:10和14:44时的1-5秒触发 。其中问号表示忽略该位置(星期)上的值。
    	 jobDetail指向具体的任务调用bean:jobInvoker。如果有多个任务,每个任务的触发时间都不一样,则可以在此配置多个不同的触发器。
	-->

</beans>

 

改定时作业只要实现了三种策略:
1.每天xx点执行
2.每周的xx星期xx点执行
3.立即执行

 

  • 大小: 15.3 KB
分享到:
评论

相关推荐

    Spring Quartz定时作业

    本项目提供了一套完整的Spring Quartz定时作业的实现,包括任务、触发器和调度的配置文件,只需将这些资源部署到Tomcat服务器上即可运行。 1. **Spring Quartz简介** Spring Quartz是基于开源Quartz Scheduler的一...

    基于SSM+quartz的定时任务管理demo

    【SSM+Quartz 定时任务管理Demo详解】 在Java Web开发中,定时任务是一项常见且重要的功能,用于执行一些周期性或者特定时间点的任务,例如数据统计、备份、清理等。本Demo以"基于SSM+quartz的定时任务管理"为主题...

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    Quartz.NET是一个强大的开源作业调度框架,用于在.NET环境中创建和执行定时任务。它提供了高度灵活的调度功能,使得开发者可以轻松地定义和控制任务的执行时间。在"Quartz.net作业调度自定义定时执行任务多任务执行...

    java quartz 定时任务

    - Quartz 是一个完全由Java编写的开源作业调度框架,它可以在Java应用中用于执行定时任务。Quartz 支持集群环境,可以在多台服务器上分布式运行,以提高系统的可用性和可靠性。 2. **定时任务**: - 定时任务是在...

    C# 控制台Quartz定时任务.doc

    【Quartz定时任务】是Java领域的一个强大任务调度框架,但在C#中也有相应的实现,如标题所示,这里讨论的是C#控制台应用中使用Quartz.NET进行定时任务的实现。Quartz.NET允许开发者在应用程序中安排任务在特定时间...

    Quartz定时任务表达式

    Quartz是一个开源的作业调度框架,能够触发在指定时间运行的任务,广泛应用于Java应用程序中进行定时任务的管理。Quartz的核心是Cron表达式,它允许开发者以一种灵活且可读性高的方式定义任务的执行时间。 #### ...

    Quartz 定时WebForm和WinForm使用的dll

    总之,Quartz定时功能在WebForm和WinForm应用中的使用涉及到了DLL的引用、Quartz的配置、任务和触发器的定义,以及对`IScheduler`的管理和控制。正确理解和运用这些知识点,可以帮助开发者构建出高效、可靠的定时...

    Quartz定时任务图形界面的系统

    Quartz定时任务图形界面系统是一种基于Java开发的高级任务调度平台,它允许开发者安排和管理应用程序中的各种任务执行。在本系统中,Quartz与其他流行的技术框架如SpringMVC、MyBatis、Thymeleaf和Bootstrap3进行了...

    Spring Quartz定时任务 jar包

    Spring Quartz定时任务jar包是Java开发中用于实现定时任务调度的一种解决方案。Quartz是一个开源的作业调度框架,它允许程序创建、调度和执行作业,而Spring框架则为Quartz提供了良好的整合,使得在Spring应用中配置...

    C# Quartz.Net定时任务操作明细、完整过程

    【C# Quartz.Net定时任务操作】Quartz.Net是一款强大的任务调度框架,广泛应用于C#环境下的定时任务管理。本文将详细介绍如何使用Quartz.Net进行定时任务的配置与执行。 首先,**通过Nuget安装框架**非常简单,只需...

    Quartz定时任务框架

    总之,Quartz定时任务框架为Java开发者提供了一套灵活且功能强大的任务调度解决方案。通过理解其核心组件和API,我们可以方便地创建和管理各种定时任务,以满足各种业务需求。在这个简单的示例中,我们看到了如何每...

    .net Quartz定时任务实例

    .NET中的Quartz是一个强大的、完全开源的作业调度框架,它为开发者提供了在应用程序中创建和管理定时任务的能力。Quartz可以被集成到任何Java应用程序中,无论是简单的应用程序还是复杂的多服务器集群环境。在这个...

    C#Quartz定时任务

    【C# Quartz定时任务】是基于C#编程语言实现的一种定时任务框架,它允许开发者在.NET环境中创建和管理定时任务。这个项目是在Visual Studio 2010开发环境下编写的,提供了一个可以直接运行的示例(demo),方便快速...

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

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

    quartz 定时任务调度

    总结,Quartz定时任务调度是Java开发中不可或缺的工具,尤其对于需要定时执行任务的系统来说。通过学习和掌握Quartz的使用,以及cron表达式的编写,我们可以构建出强大且灵活的任务调度系统。同时,利用插件系统和...

    定时任务quartz实现分组串行并行动态配置

    Quartz是一款广泛使用的开源作业调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在实际应用中,我们可能需要根据业务需求动态地配置定时任务的执行方式,例如,某些任务可能需要串行执行,而其他任务则...

    Quartz定时任务简单列子

    综上所述,这个"Quartz定时任务简单列子"可能涵盖了创建Job类,定义Trigger,以及如何使用Scheduler来启动和管理任务的基本步骤。如果你想要深入学习Quartz,还需要了解更多的高级特性,比如作业存储、触发器策略、...

    quartz定时任务

    在“quartz定时任务”这个主题中,我们将深入探讨Quartz的核心特性、如何配置和使用它,以及如何实现集群。 1. **Quartz的核心特性** - **灵活的调度**:Quartz支持多种调度模式,如简单触发器、cron触发器和Nth...

    quartZ定时任务.zip

    下面将详细介绍如何利用Quartz在SpringBoot项目中创建、管理和停止定时任务,并根据业务需求配置cron表达式来设定执行周期。 1. **Quartz简介** - Quartz是Java平台上的一个强大、灵活的作业调度库,它可以与Java...

    Quartz 定时任务web使用

    Quartz 是一个开源的作业调度框架,常用于Java应用程序中实现定时任务的管理。它提供了丰富的API和功能,使得开发者可以灵活地定义和控制任务的执行。本篇将重点介绍如何在Web环境中集成并使用Quartz,以及相关的...

Global site tag (gtag.js) - Google Analytics