论坛首页 Java企业应用论坛

动态改变quartz的触发器策略?

浏览 11525 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-07-05  
在使用 opensymphony的 quartz的时候,它内部提供了 trigger,例如:
 trigger = TriggerUtils.makeHourlyTrigger();; //trigger every hour

上面的代码意思是每小时触发一次任务。
这个配置在 quartz第一次启动的时候就读入到内存中了,我得问题是如果我需要动态改变我得任务启动策略该怎麽作呢? 比如每小时触发一次任务后,我希望下个任务是每分钟触发一次,当然任务的次数是无限的,好像 quartz 没有考虑到这个需求,我看他的API没有提供这个解决办法,各位有用过 quartz的遇到过这个问题么?
   发表时间:2006-07-05  
自己new 一个SimpleTrigger啊。
以后可以用Trigger得name, group找到这个trigger做替换的。
0 请登录后投票
   发表时间:2006-07-05  
dwangel 写道
自己new 一个SimpleTrigger啊。
以后可以用Trigger得name, group找到这个trigger做替换的。


我什么时候new这个trigger呢?本次任务结束时么?那个时候还是属于本次的trigger范围的,会抛异常的
0 请登录后投票
   发表时间:2006-07-05  
用Spring的SchedulerFactoryBean来调度你的Trigger,然后把SchedulerFactoryBean注入到你的Service中,就可以根据你的要求重新set你的Trigger并运行job。

我以前做过相关试验,不知道能不能满足你的要求:
http://lu-zhou.spaces.msn.com/blog/cns!5985888977452F29!320.entry
0 请登录后投票
   发表时间:2006-07-05  
downpour 写道
用Spring的SchedulerFactoryBean来调度你的Trigger,然后把SchedulerFactoryBean注入到你的Service中,就可以根据你的要求重新set你的Trigger并运行job。

我以前做过相关试验,不知道能不能满足你的要求:
http://lu-zhou.spaces.msn.com/blog/cns!5985888977452F29!320.entry


多谢回复,但是我们的开发环境是定义好的,使用的只是 quartz 1.5.2,没有使用 spring,所以使用 spring 的方式不大可能的。 我看到官方论坛上给的回复:
One option is to have a trigger listener that reschedules the trigger for the next fire time it reads from the db each time the trigger completes. 

但是 我定义了一个类实现 triggerListener接口,并且能够覆盖他的方法triggerComplete,这个方法如下:
public void triggerFired(Trigger arg0, JobExecutionContext arg1); {
。。。。。。。。。。。。。。。。。。。。。。。。。。
}

但是荒唐的是这个 arg0参数是不能改变的!? 按照常理说它应该有个方法例如 setNextFireTime 用来改变下一次的trigger时间,但是 NextFireTime只有 getter没有 setter?! 唯一一个可能使用的方法是
triggered
public abstract void triggered(Calendar calendar);
This method should not be used by the Quartz client. 

Called when the Scheduler has decided to 'fire' the trigger (execute the associated Job);, in order to give the Trigger a chance to update itself for its next triggering (if any);. 



但是里面的 Calendar还不是 java中的java.util.Calendar,是一个很奇怪的几乎和时间没有关系的对象,到底怎麽使用这个方法更新 trigger?并使他下一次生效? 
0 请登录后投票
   发表时间:2006-07-06  
rescheduleJob(String jobName,String jobGroup ,Trigger newTrigger)
这不就行了吗?
0 请登录后投票
   发表时间:2006-08-14  
lyo 写道

但是 我定义了一个类实现 triggerListener接口,并且能够覆盖他的方法triggerComplete,这个方法如下:
public void triggerFired(Trigger arg0, JobExecutionContext arg1); {
。。。。。。。。。。。。。。。。。。。。。。。。。。
}

但是荒唐的是这个 arg0参数是不能改变的!? 按照常理说它应该有个方法例如 setNextFireTime 用来改变下一次的trigger时间,但是 NextFireTime只有 getter没有 setter?! 唯一一个可能使用的方法是
triggered
public abstract void triggered(Calendar calendar);
This method should not be used by the Quartz client. 

但是里面的 Calendar还不是 java中的java.util.Calendar,是一个很奇怪的几乎和时间没有关系的对象,到底怎麽使用这个方法更新 trigger?并使他下一次生效? 

此Calendar非彼Calendar,好好学习下Quartz的QuickStart吧。。。
0 请登录后投票
   发表时间:2006-08-15  
楼主对quartz的机制理解不深。
quartz里的trigger是触发器,
Job是任务。

主scheduler检查触发器条件满足而执行任务。

如果一个trigger启动后,你仅仅再次更改trigger是无法影响到job的。应该是将期望的trigger绑定到job上。
0 请登录后投票
   发表时间:2006-09-14  
可以用spring的SchedulerFactoryBean来动态加载和管理定时器。
0 请登录后投票
   发表时间:2006-09-14  
在Job里面写一些  关掉现在的触发  然后修改参数  然后重新启动一个新的触发 的东西 试试
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics