随笔-193  评论-715  文章-1  trackbacks-0
本Blog所有内容不得随意转载,版权属于作者所有。如需转载请与作者联系( fastzch@163.com )。
未经许可的转载,本人保留一切法律权益。

今天早上一朋友问我如何在Spring中动态更新Quartz的启动时间,我试了一把,记录如下:

动态更新的Java类如下:
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class QuartzTest {
    ClassPathXmlApplicationContext context 
= new ClassPathXmlApplicationContext(
            
"/applicationContext.xml");
    
private static String INSTANCE_NAME = "DEFAULT";

    
public void test() throws Exception {
        Scheduler sch 
= (Scheduler) context.getBean("BatchJobStarting");
        JobDetail myJob 
= sch.getJobDetail("CleanLogJob", INSTANCE_NAME);
        CronTrigger newTrigger 
= new CronTrigger("trig_batch", INSTANCE_NAME,
                
"0/3 * * * * ?");
        JobDetail newJob 
= (JobDetail) myJob.clone();
        sch.deleteJob(
"CleanLogJob", INSTANCE_NAME);
        sch.scheduleJob(newJob, newTrigger);
    }


    
public static void main(String[] args) {
        QuartzTest qt 
= new QuartzTest();
        
try {
            qt.test();
        }
 catch (Exception e) {
            e.printStackTrace();
        }


    }

}
代码写得比较简陋,主要是test()方法,大家可以根据自己的实际情况再发挥,例如,如果你是用Web方式改的话,context的获取可以直接从WebApplicationContext中获取。

applicationContext.xml的配置如下:
    <bean id="CleanLogJob"
        class
="org.springframework.scheduling.quartz.JobDetailBean">
        
<property name="jobClass">
            
<value>com.***.***.biz.log.CleanLogJob</value>
        
</property>
        
<property name="jobDataAsMap">
            
<map>
                
<entry key="logService">
                    
<ref bean="LogService" />
                
</entry>
            
</map>
        
</property>
    
</bean>
    
<bean id="CleanLogJobTrigger"
        class
="org.springframework.scheduling.quartz.CronTriggerBean">
        
<property name="jobDetail">
            
<ref bean="CleanLogJob" />
        
</property>
        
<property name="cronExpression">
            
<value>0 0 0 * * ?</value>
        
</property>
    
</bean>
    
<bean id="BatchJobStarting"
        class
="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        
<property name="triggers">
            
<list>
                
<ref bean="CleanLogJobTrigger" />
            
</list>
        
</property>
    
</bean>

网上也有一些其它的解法,但似乎比我这个都要复杂,呵呵。。。
posted on 2008-03-31 15:34 Robin's Programming World 阅读(5529) 评论(7)  编辑  收藏 所属分类: Java

评论:
# re: Quartz与Spring结合时如何动态更新Job的启动时间 2008-03-31 18:09 | 隔叶黄莺
仍然是要使用代码,如果使用上 Quartz 自己的一个插件就可以定时的扫描文件,运行中只要改配置保存就行。  回复  更多评论
  
# re: Quartz与Spring结合时如何动态更新Job的启动时间 2008-03-31 21:07 | Robin's Java World
@隔叶黄莺
原来还有这好的东东呀?有没有介绍这个插件的文档了?  回复  更多评论
  
# re: Quartz与Spring结合时如何动态更新Job的启动时间 2008-03-31 21:13 | Robin's Java World
@隔叶黄莺
你说的是JobInitializationPlugin这个Plugin吗?  回复  更多评论
  
# re: Quartz与Spring结合时如何动态更新Job的启动时间 2008-03-31 22:07 | 隔叶黄莺
是的,就是这个,在 quartz.properties 可配置多久测试一下配置文件是否被修改过,有则读入新的内容,调整执行计划  回复  更多评论
  
# re: Quartz与Spring结合时如何动态更新Job的启动时间 2008-04-01 14:33 | Robin's Java World
@隔叶黄莺
谢谢!
不过一般的人在用Spring的时候大都采用在applicationContext中定义。
另外,不知道你有没有使用这个插件时在quartz.properties配置的实例了?  回复  更多评论
  
# re: Quartz与Spring结合时如何动态更新Job的启动时间 2008-04-01 19:57 | 隔叶黄莺
我近来在翻译《Quartz Job Scheduling Framework》,有兴趣可以来看看
http://www.blogjava.net/Unmi/category/27619.html

现丑了。  回复  更多评论
  
# re: Quartz与Spring结合时如何动态更新Job的启动时间 2008-08-04 12:24 | Robin's Java World
有朋友发邮件问我,说如何动态的启动和停止一个Job,其实很简单。如下即可:
//得到一个Job
//删除此Job
sch.deleteJob("CleanLogJob", INSTANCE_NAME);

//启动时先创建一个Job
//然后启动此Job
sch.scheduleJob(newJob, newTrigger);  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: