springmvcquartz:如何从视图或html页面设置调度程序



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方法的参数,而不仅仅是名称,因为这将允许您指定触发器的组,以防您在某一天使用默认值以外的组。

最新更新