1

我在 Spring 中实现了一个计划作业,我使用 Spring 3.1.1 和 Hibernate 和 Struts2。配置工作正常,但我想动态更改 de cron,所以我找到了几个示例但我无法实现它们,到处都是不同的配置,我只需要从数据库而不是配置文件中读取 cron 值。这有可能吗?

我的配置现在看起来像这样:

<!-- Scheduler Tasks -->
<bean name="statTask" class="com.bvc.spring.schedulers.MarketStatusJob"></bean>

<!-- Scheduler jobs -->
<bean id="statJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="statTask" />
    <property name="targetMethod" value="execute" />
</bean>

<!-- Cron Triggers -->
<bean id="statCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="statJobDetail" />
    <property name="cronExpression" value="0 30 12 1/1 * ? *"/>
</bean>

<!-- Triggers -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="statCronTrigger"/>
        </list>
    </property>
</bean>

提前感谢您的帮助。

4

2 回答 2

0

你不需要有 statCronTrigger,需要在你的主类作业细节中实现石英触发器就可以了。

    CronTrigger trigger = null;
    JobDetail jobD;


    //Load context
    ApplicationContext context = new ClassPathXmlApplicationContext("YOUR_CONTEXT_FILES.xml");

    //Setup JobDetail

    jobD = (JobDetail) context.getBean("statJobDetail");

    //Setup CronTrigger
    try {
        trigger = new CronTrigger();
        trigger.setName("AppTrigger");
        trigger.setGroup(jobD.getGroup());
        trigger.setJobName(jobD.getName());
        trigger.setJobGroup(jobD.getGroup());
        trigger.setCronExpression("*/10 * * * * ?");// you can read this from DB as well or any other configured string 

    } catch (ParseException e1) {
        e1.printStackTrace();
    }

    //Scheduler
try{

        Scheduler scheduler =  (Scheduler) context.getBean("Scheduler");
        scheduler.scheduleJob(jobD, trigger);

您可以在上下文中添加石英调度程序 bean

  <bean id="Scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"></bean>
于 2014-01-27T08:45:18.540 回答
0

可能最简单的方法是,CronTriggerBean在重写的方法中子类化和实现数据库属性解析setCronExpression(..),您可以在其中访问数据库,获取所需的 cron,然后调用super.setCronExpression(dbValue)

另一种更难的方法是实现PropertyPlaceholderConfigurer从数据库而不是属性文件中读取它们的方法。不过,这可能不是微不足道的。不支持这一点,因为从属性文件中读取值更为习惯。另请注意,您将无法在执行期间动态更改 cron。

于 2012-10-25T10:58:32.347 回答