使用quartz定制计划任务的问题

newyu1127 2007-12-06 05:50:51
各位兄弟:
看了一些有关quartz的文档,试着写一个例子,用一个TestJob类实现Job
public class TestJob implements Job
{
public TestJob(){

}
public void execute(JobExecutionContext context) throws JobExecutionException
{
JobDetail jobDetail = context.getJobDetail();///通过这个取得调用任务的对象
System.out.println("job executing..."+jobDetail.getName()); }
}
测试类为
public class TestMain {
try {
JobDetail jobDetail =
new JobDetail("testJob", "jGroup1",TestJob.class); ///声明执行哪个操作

//触发器的设置(设置了两个触发器)
CronTrigger cronTrigger1 = new CronTrigger("trigger1_1", "tGroup1");
CronExpression cexp1 = new CronExpression("0 15 10 15 * ?");//每月15日10:15分运行。
cronTrigger1.setCronExpression(cexp1);

CronTrigger cronTrigger2 = new CronTrigger("trigger1_2", "tGroup1");
CronExpression cexp2 = new CronExpression("0 15 18 L * ?");//每月最后一天18:15分运行。
cronTrigger2.setCronExpression(cexp2);
//启动任务
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//为同一个工作绑定两个触发器
scheduler.scheduleJob(jobDetail, cronTrigger1);
scheduler.scheduleJob(jobDetail, cronTrigger2);

scheduler.start();

} catch (Exception e) {
e.printStackTrace();
}
}
功能是为了在两个不同时间触发同一个操作。可是一运行就出错:
org.quartz.ObjectAlreadyExistsException: Unable to store Job with name: 'testJob' and group: 'jGroup1', because one already exists with this identification.
at org.quartz.simpl.RAMJobStore.storeJob(RAMJobStore.java:222)
at org.quartz.simpl.RAMJobStore.storeJobAndTrigger(RAMJobStore.java:195)
at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:703)
at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:255)
at testqz.TestMain.startSchedule(TestMain.java:131)

我把scheduler.scheduleJob(jobDetail, cronTrigger2);这句屏掉倒是可以运行正常了。不会吧,难道同一动作只能绑定一个触发器?!!quartz不会连这种功能都实现不了吧?!!!

还有就是如果scheduler.start();后,我还想再增加任务,直接scheduler.scheduleJob可以吗?
如果scheduler.start();后我要删除某个Trigger,用什么方法?
如果scheduler.start();后我要删除某个job,但又想保留Trigger,用什么方法?

谢谢赐教。如果有详细解答,分不是问题。


...全文
2437 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT布道 2009-09-28
  • 打赏
  • 举报
回复
quartz里面的jobname和groupname加起来就是job对象,这个必须每次都不一样,比如你是使用的持久化数据库的方式,这两个字段是关键字,你觉得可以重复吗,同理,triggername和triggergroup也是一样的道理,他们两个组合成一个trigger的对象。在数据库里,他们两个也是关键字。所以,他们两个组合起来必须是唯一的对象!!!
waveicesky 2008-04-14
  • 打赏
  • 举报
回复
请问楼上的(hjysuccess),怎样得到job的状态?
现在急用,敬请回复!
hjysuccess 2007-12-17
  • 打赏
  • 举报
回复
可以根据任务调度的条件来判断,需要执行那一个任务,那么首先需要获得该任务的对象,根据该对象获得该任务的状态,那么就可以判断该任务是否正在执行、执行过了、未执行、执行成功或者执行失败等。
newyu1127 2007-12-17
  • 打赏
  • 举报
回复
怎么就没人用过吗?
dracularking 2007-12-12
  • 打赏
  • 举报
回复
关注
newyu1127 2007-12-11
  • 打赏
  • 举报
回复
TO xiyuan1999 :
兄台可能还没完全明白我的意思,其实我的程序要求是:
每天定时从数据库取出任务计划(操作和触发器表达式),然后判断当前scheduler是否有工作正在运行(或者说有
触发器正在触发中),如果没有,那么就停止scheduler,将数据库取到的一系列计划任务重新加载。如果有,那么就延时以待至可以重新加载为止。因为这些计划任务是存在数据库中的,而且很可能经常修改,所以通过配置文件是无法达到我程序的需要的吧。

其实我就想问:
如果scheduler.start();后我要删除某个Trigger,用什么方法?
如果scheduler.start();后我要删除某个job,但又想保留Trigger,用什么方法?
若某一时刻,我要判断当前scheduler中所有任务是否有正在工作的,怎么判断?
jingtao8177 2007-12-11
  • 打赏
  • 举报
回复
up
zhoche2008 2007-12-11
  • 打赏
  • 举报
回复
没用过.顶下.
xiyuan1999 2007-12-07
  • 打赏
  • 举报
回复
以上我是配置了2个任务的

代码在帖子里面
newyu1127 2007-12-07
  • 打赏
  • 举报
回复
谢谢楼上的,我试过了
JobDetail jobDetail2 =
new JobDetail("testJob2", "jGroup1",TestJob.class);
然后scheduler.scheduleJob(jobDetail2, cronTrigger2);这样是正常的。难道quartz中只能这样调用,即使使用的是同一个JOB类,也要重新new一个JobDetail对象,才能加入任务?
还有
如果scheduler.start();后我要删除某个Trigger,用什么方法?
如果scheduler.start();后我要删除某个job,但又想保留Trigger,用什么方法?
若某一时刻,我要判断当前scheduler中所有任务是否有正在工作的,怎么判断?
xfzhang83 2007-12-07
  • 打赏
  • 举报
回复
jobDetail new两个看看.没试过两个工作的.
newyu1127 2007-12-07
  • 打赏
  • 举报
回复
都没人用过quartz吗?
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析Quartz、Spring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架和框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。
和现今许多在用的开源项目一样,Quartz之初也只是为个人开发者提供了一个简单的实现方案。但是随着日益增多的关键人员的积极参与和慷慨的贡献,Quartz 已经成为了一个为众人所知,并且能帮助人们解决更大问题的框架。 Quartz 项目 是由 James House 创立的,它在1998年就有该框架最初的构思。包括作业队列的概念,使用线程池来处理作业,也许它最早的模型已不为现今的Quartz使用者所知了。 在接下来的数年中,House 自己说他一直在关注着同一个需求:需要一个灵活的作业调度工具。他在找寻便宜且具有丰富特征的Java作业调度工具时,让他面临着以下几个选择: ·一个昂贵的商业化工具 ·嵌入在大框架之中的,根本用不着这么一个大框架 ·类似 Unix Cron 或者 Windows 的计划任务 ·自己亲自定制的方案 House 有限的选择和在这个问题上的兴趣促成了他为作业调度器创建一个开源的项目。在2001年春天,他在 SourceForge 上创立了该项目,这一网址 http://sourceforge.net/projects/quartz 现在还是有效的,只是已经不再维护了。 自从 Quartz 的雏形一出来,众多的捐助者和开发人员加入到这个项目中来。然而应该说,Quartz 能象今天这么存在还是要感谢 House 以及他在作业调度领域中的兴趣。在众多人眼中,他那解决问题的决心很值得称颂的。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧