嗨,我正在使用 spring mvc 和quartz,到目前为止,我已经做了一个简单的示例,每隔一定时间在控制台中打印一条消息,但现在我想从 html 页面设置该时间,我的意思是给用户能够在文本框中输入一个数字,如下所示:seconds: 4
并且该消息将每 4 秒打印一次,我该怎么做?我所做的示例是将时间放入配置 xml 文件中。
这是我到目前为止所拥有的:
这是我的 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>
这是我的类(class):
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 Controller 中注入(inject)调度程序:
@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 注入(inject)(或者最好为 ScheduleManager 创建一个接口(interface)并将其注入(inject))到需要使用它的任何 Controller :
@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 注入(inject)到任何负责更改时间表的 Controller 中
@Autowired
private SchedulerManager schedulerManager;
最后,您可以考虑将 TriggerKey 作为 rescheduleTrigger 方法的参数,而不仅仅是名称,因为这样您还可以指定触发器组,以防有一天您使用默认值以外的触发器组。
关于java - Spring MVC quartz : how to set the scheduler from the view or a html page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26720568/