hi我正在使用spring-mvc和quartz,到目前为止,我已经做了一个简单的例子,在控制台中每隔一段时间打印一条消息,但现在我想从html页面设置该时间,我的意思是让用户能够在文本框中输入一个数字,如下所示:seconds: 4
,消息将每4秒打印一次,我该怎么做??我做的例子是,你把时间放在configxml文件中。
这就是我目前所拥有的:
这是我的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--QUARTZ PRUEBA -->
<beans:bean id="runMeTask" class="com.abc.domain.RunMeTask" />
<!-- Spring Quartz -->
<beans:bean name="runMeJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<beans:property name="jobClass" value="com.abc.domain.RunMeJob" />
<beans:property name="jobDataAsMap">
<beans:map>
<beans:entry key="runMeTask" value-ref="runMeTask" />
</beans:map>
</beans:property>
</beans:bean>
<!--
<bean id="runMeJob"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="runMeTask" />
<property name="targetMethod" value="printMe" />
</bean>
-->
<!-- Simple Trigger, run every 5 seconds -->
<!-- <beans:bean id="simpleTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<beans:property name="jobDetail" ref="runMeJob" />
<beans:property name="repeatInterval" value="5000" />
<beans:property name="startDelay" value="1000" />
</beans:bean> -->
<!-- Cron Trigger, run every 5 seconds -->
<beans:bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<beans:property name="jobDetail" ref="runMeJob" />
<beans:property name="cronExpression" value="0/2 * * * * ?" />
</beans:bean>
<beans:bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<beans:property name="jobDetails">
<beans:list>
<beans:ref bean="runMeJob" />
</beans:list>
</beans:property>
<beans:property name="triggers">
<beans:list>
<beans:ref bean="cronTrigger" />
</beans:list>
</beans:property>
</beans:bean>
<!--FIN QUARTZ PRUEBA -->
</beans:beans>
这是我的课程:
public class RunMeTask {
public void printMe() {
System.out.println("Spring 3 + Quartz 1.8.6 ~");
}
}
和:
public class RunMeJob extends QuartzJobBean {
private RunMeTask runMeTask;
public void setRunMeTask(RunMeTask runMeTask) {
this.runMeTask = runMeTask;
}
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
runMeTask.printMe();
}
}
您可以在mvc控制器中注入调度器:
@Autowired
private Scheduler scheduler;
并添加以下方法,您可以使用新的cron表达式调用该方法来重新调度它:
public void rescheduleTrigger(String cronExpression) throws ParseException,
SchedulerException {
CronTriggerImpl cronTrigger = (CronTriggerImpl) scheduler
.getTrigger(new TriggerKey("simple"));
cronTrigger.setCronExpression(cronExpression);
scheduler.rescheduleJob(cronTrigger.getKey(), cronTrigger);
}
为了获得更好的设计方法,您可以将上面的代码放在一个单独的类中,例如"ScheduleManager",并将触发器名称作为参数,而不是"简单"的硬编码。然后,该类可以用于更改任何触发器的时间表,方法是将ScheduleManager(或者最好为ScheduleManager创建一个接口并将其注入)注入任何需要使用它的控制器:
@Service
public class SchedulerManagerImpl implements SchedulerManager {
@Autowired
private Scheduler scheduler;
public void rescheduleSimpleTrigger(String triggerName, String cronExpression) throws ParseException,
SchedulerException {
CronTriggerImpl cronTrigger = (CronTriggerImpl) scheduler
.getTrigger(new TriggerKey(triggerName));
cronTrigger.setCronExpression(cronExpression);
scheduler.rescheduleJob(cronTrigger.getKey(), cronTrigger);
}
}
这样,您现在只需将SchedulerManager注入任何负责更改时间表的控制器
@Autowired
private SchedulerManager schedulerManager;
最后,您可以考虑将TriggerKey作为rescheduleTrigger方法的参数,而不仅仅是名称,因为这将允许您指定触发器的组,以防您在某一天使用默认值以外的组。