项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化

项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化

原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下!

弟子规 圣人训 首孝弟 次谨信 泛爱众 而亲仁 有余力 则学文

Written In The Font

需要:WEB-INF/lib/quartz-2.2.1.jar

基本步骤:

web.xml注册监听器ScheduleStartListener

注册quartz监听器,监听项目是否启动或者重启.保证项目启动或重启时,所有任务会被重新安排到任务调度中.

web.xml添加一个Listener:

<!-- quartz监听器 -->
<listener>
    <listener-class>sedion.jeffli.wmuitp.listener.ScheduleStartListener</listener-class>
</listener>

监听器类sedion.jeffli.wmuitp.listener.ScheduleStartListener实现

监听器类主要是实现recovery各个任务,重新恢复在triggerGroups组中所有的触发器,按新的trigger重新设置job执行.顺便说下,这个异常自定义(不需要删除即可): sedion.jeffli.wmuitp.exception.QuartzException;

package sedion.jeffli.wmuitp.listener;

import java.util.List;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

import sedion.jeffli.wmuitp.exception.QuartzException;

public class ScheduleStartListener implements ServletContextListener
{

    public void contextDestroyed(ServletContextEvent sce)
    {

    }

    public void contextInitialized(ServletContextEvent sce)
    {
        try
        {
            recovery();
        }
        catch (Exception e)
        {
            throw new QuartzException(" ScheduleStartListener contextInitialized ERROR!!",e);
        }
    }

    public void recovery()
    {

        Scheduler scheduler = null;

        try {

            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            scheduler = schedulerFactory.getScheduler();//可以通过SchedulerFactory创建一个Scheduler实例
            List<String> triggerGroups = scheduler.getTriggerGroupNames();//获取调度器中所有的触发器组
            System.out.println("调度器中所有的触发器组 size():"+triggerGroups.size());

            if(triggerGroups != null && triggerGroups.size() != 0)//重新恢复在triggerGroups组中所有的触发器
            {
                for (int i = 0; i < triggerGroups.size(); i++)
                {
                        TriggerKey triggerKey = TriggerKey.triggerKey(triggerGroups.get(i), triggerGroups.get(i));
                        System.out.println("triggerKey:"+triggerKey);

                        Trigger tg = scheduler.getTrigger(triggerKey);//获取trigger
                        System.out.println(triggerKey+" -> 执行时间 :"+tg.getNextFireTime());

                        scheduler.rescheduleJob(triggerKey, tg);//按新的trigger重新设置job执行
                }
            }

            scheduler.start();

        }
        catch (Exception e)
        {
            throw new QuartzException("ScheduleStartListener  recovery() Error!", e);
        }
    }
}

测试案例第一步: Job 接口实现类JobTest

顾名思义,用于自定义任务,方法的实现.你可以在其中写入任意你想要在那个点上干的事情(操作数据库,前台显示等).在下面那处地方写入你想要写的:System.out.println("添入需要加入任务的具体操作");
.顺便说下,这个异常自定义(不需要删除即可):

package test.quartz;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

import sedion.jeffli.wmuitp.exception.QuartzException;

public class JobTest implements Job{

    public JobTest() {}    

    public void execute(JobExecutionContext context)throws JobExecutionException
    {  

        JobDataMap data = context.getJobDetail().getJobDataMap();
        System.out.println("data.testId : "+data.getInt("testId")); //不需要可删除

        try
        {
            System.out.println("添入需要加入任务的具体操作");
        }
        catch (Exception e)
        {
            throw new QuartzException("JobTest execute() ERROR !!", e);
        }
    }  

    public static void removeJob(JobKey jobKey, TriggerKey tiKey)throws SchedulerException
    { 

        SchedulerFactory sf     = new StdSchedulerFactory();
        Scheduler          sched     = sf.getScheduler();  

        sched.pauseTrigger(tiKey);            //停止触发器
        sched.unscheduleJob(tiKey);            //移除触发器
        sched.deleteJob(jobKey);            //删除任务  

    }
}

测试案例第二步:QuartzTest

顾名思义,用于实现,检验.可以通过SchedulerFactory创建一个Scheduler实例,把触发器在集群节点实例命名的组只是为了区分(伐木)从什么地方定问调度重新执行此作业,如果它是正在进行时调度下去.

package test.quartz;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzTest
{

    public void run(String date, int id)throws Exception
    {

        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();//可以通过SchedulerFactory创建一个Scheduler实例

        //设置工作详情
        JobDetail job = newJob(JobTest.class)
            .withIdentity("job_"+id, "test"+id)         // (String name, String group)把触发器在集群节点实例命名的组只是为了区分(伐木)从什么地方定问调度重新执行此作业,如果它是正在进行时调度下去...
            .requestRecovery()
            .build();

        job.getJobDataMap().put("testId", id);        //设置存储参数(不需要可删除)

        Date startDate = FormatDate.stringToDateAll(date);//Date转String
        //设置触发器
        SimpleTrigger trigger = (SimpleTrigger) newTrigger()
                .withIdentity("overdue"+id, "overdue"+id)//withIdentity("trigger", "group")
                .startAt(startDate)
                .build();

        scheduler.scheduleJob(job, trigger);
        scheduler.start();
        System.out.println("------- Start Scheduler ----------------");
    }

    public static void main(String[] args) throws Exception
    {
        QuartzTest quartzOverdue = new QuartzTest();
        quartzOverdue.run("2014-07-02 00:30:00",666);//666,随便的吉祥数字
    }
}

这边,项目tomcat启动.这边我的主机时间是:

然后我们运行:

public static void main(String[] args) throws Exception
    {
        QuartzTest quartzOverdue = new QuartzTest();
        quartzOverdue.run("2014-07-02 00:30:00",666);//666,随便的吉祥数字
    }

看控制台:

先输出

------- Start Scheduler ----------------

然后时间到了

添入需要加入任务的具体操作

项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化

时间: 2024-10-07 12:05:09

项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化的相关文章

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

前言 系列文章:[传送门] 洗了个澡,准备写篇博客.然后看书了.时间 3 7 分.我慢慢规律生活,向目标靠近.  很喜欢珍惜时间像叮当猫一样 正文 慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实现签到 这次 我们实现 javaweb http json 交互 in action 题目很长,但我想让你们看下,给我点意见. 开始吧 实战 本次以经典的登录作为案例.登录做的好也是经典. 服务端 和 app端,服务端简略,app端详细介绍... 服务端 资料: <spring> @Respons

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

前言 系列文章:[传送门] 洗了个澡,准备写篇博客.然后看书了.时间 3 7 分.我慢慢规律生活,向目标靠近.  很喜欢珍惜时间像叮当猫一样 正文 慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实现签到 这次 我们实现 javaweb http json 交互 in action 题目很长,但我想让你们看下,给我点意见. 开始吧 实战 本次以经典的登录作为案例.登录做的好也是经典. 服务端 和 app端,服务端简略,app端详细介绍... 服务端 资料: <spring> @Respons

项目ITP(五) spring4.0 整合 Quartz 实现任务调度

前言 系列文章:[传送门] 项目需求: 二维码推送到一体机上,给学生签到扫描用.然后需要的是 上课前20分钟 ,幸好在帮带我的学长做 p2p 的时候,接触过.自然 quartz 是首选.所以我就配置了下,搞了个小样例给大家. 正文 spring4.0 整合 Quartz 实现任务调度.这是期末项目的最后一篇,剩下到暑假吧.  Quartz 介绍 Quartz is a full-featured, open source job scheduling service that can be in

项目ITP(六) spring4.0 整合 Quartz 实现动态任务调度

前言 系列文章:[传送门] 项目需求: http://www.cnblogs.com/Alandre/p/3733249.html 上一博客写的是基本调度,后来这只能用于,像每天定个时间 进行数据库备份.但是,远远不能在上次的需求上实现.所以需要实现spring4.0 整合 Quartz 实现动态任务调度. 正文 spring4.0 整合 Quartz 实现任务调度.这真是期末项目的最后一篇,剩下到暑假吧.  Quartz 介绍 Quartz is a full-featured, open s

Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复----每一个你不满意的当下,都有一个你不曾努力的过去

摘要:在项目的管理功能中,对定时任务的管理有时会很常见.但一般定时任务配置都在xml中完成,包括cronExpression表达式,十分的方便.但是如果我的任务信息是保存在数据库的,想要动态的初始化,还有就是任务较多的时候不是得有一大堆的xml配置?或者说我要修改一下trigger的表达式,使原来5秒运行一次的任务变成10秒运行一次,或者说我要控制定时任务的 “ 暂停 ” 呢?暂停之后又要在某个时间点 “ 重启 ” 该定时任务呢?或者说直接 “ 删除 ” 该定时任务呢?要 改变某定时任务的触发时

spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

最近做了一个spring boot 整合 quartz  实现 动态定时任务配置,在集群环境下运行的 任务.能够对定时任务,动态的进行增删改查,界面效果图如下: 1. 在项目中引入jar 2. 将需要的表导入数据库 官网上有不同数据库的脚本,找到对应的,导入即可 3. java 代码 将quartz 的相关配置文件,配置为暴露bean,方便后期引用. 有一处关键的地方,就是注入spring 上下文,也可以算是一个坑.如果,不注入spring 上下文,那么新添加的定时任务job,是新new 的一个

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

一.spring整合 网上一搜有很多整合的方式,这里我采用了其中的一种(暂时还没有对其他的方法研究过). 对于spring的整合其中的任务,spring提供了几个类.接口(这些类都实现了Job接口): org.springframework.scheduling.quartz.QuartzJobBean org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.MethodInvokingJob org.sp

spring整合quartz并持久化

spring整合quartz有两种方式: 一.常见是使用配置文件,将定时任务保存到内存中 简单示例: <!-- 短信催还提醒任务调度 --> <bean id="overdueRecall" class="com.sursen.souba.ddlibserve.quartz.OverdueRecallTimerTask" /> <!--定义定时执行overdueRecallTimerTask 这个bean中的overdueRecall(

Spring 3整合Quartz 2实现定时任务一:常规整合 (基于maven构建) - mjorcen(转)

Spring 3整合Quartz 2实现定时任务一:常规整合 (基于maven构建) - mjorcen(转) 最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依赖的jar文件,我的项目是maven管理的,以下的我项目的依赖: <properties> <project.build.sourceEncoding>UTF-8</p