版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/u010378410/article/details/36255511

项目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 ----------------

然后时间到了

添入须要增加任务的详细操作

最新文章

  1. 模仿EF,我们用JS开发的HTML5 SQLite 访问库
  2. C#汉字转拼音帮助类
  3. C# 一些知识点总结(一)_继承,多态,集合,关键字...
  4. [CF442C] Artem and Array (贪心+单调栈优化)
  5. 收集 关于php的博文
  6. LED灯开关电路
  7. c++回调实现
  8. Hibernate缓存、组件、继承映射
  9. hdoj 1874 畅通工程续(单源最短路+dijkstra)
  10. epii.js简约而不简单的JS模板引擎
  11. POJ 1849 Two(树的直径--树形DP)(好题)
  12. 使用 whistle 替代本地 nginx/webpack 服务
  13. Javal连接字符串为Json
  14. 产品经理教你如何构建电商电销 CRM 系统
  15. elasticsearch 通过HTTP RESTful API 操作数据
  16. tomcat quartz 被触发两次
  17. shell编程学习笔记(八):Shell中的if条件判断
  18. php Call to undefined function imagettftext()问题解决
  19. c#序列化Json和反序列化
  20. Java基础——String类(一)

热门文章

  1. linux crontab定时任务运行shell脚本(shell执行sql文件)
  2. bzoj1706 relays 奶牛接力跑 线性代数
  3. js匿名函数与闭包作用
  4. xcode下的DerivedData
  5. c# 将Datarow转成Datarowview
  6. hibernate 注释多表 级联操作
  7. A20地址线科普【转载】
  8. Leetcode147. Insertion Sort List对链表进行插入排序
  9. 洛谷P5319 奥术神杖
  10. 对比Model前后数据保存不同值