我在Spring中实现了一个Scheduled Job,我正在使用带有Hibernate和Struts2的Spring 3.1.1。配置工作正常,但我想动态更改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>
先谢谢你的帮助。
答案 0 :(得分:0)
可能最简单的方法是,将CronTriggerBean
子类化并在重写的setCronExpression(..)
方法中实现数据库属性解析,然后转到数据库,获取所需的cron,并调用{{1} }
另一种更难的方法是实现从数据库而不是属性文件中读取它们的super.setCronExpression(dbValue)
。但这可能不是微不足道的。对此没有支持,因为从属性文件中读取值更为习惯。另请注意,您将无法在执行期间动态更改cron。
答案 1 :(得分: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);
您可以在上下文中添加quartz scheduler bean
<bean id="Scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"></bean>