java - Spring MVC quartz : how to set the scheduler from the view or a html page

标签 java spring spring-mvc scheduled-tasks quartz-scheduler

嗨,我正在使用 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/

相关文章:

java - 引用 spring bean 中的一组属性

java - 有没有一种简单的方法可以在 Spring MVC 中将空表单输入转换为空字符串?

jquery - 400(错误请求)错误 - Spring MVC 使用 JQuery AJAX 上传文件

java - 两个 Java 运算符之间的区别 : ! = vs !equals

java - Mongodb:无法保存添加到 BasicDBList 中的新元素

java - 重新哈希时清除 Java 哈希表?

spring - AspectJ 和 NoSuchBeanDefinitionException 至少有 1 个有资格作为此依赖项的 Autowiring 候选者的 bean

java - 如何管理 Wordle Game (JavaFx) 中的重复字母?

hibernate - 单元测试 fetchtype 惰性

java - 在 Spring Boot 中以编程方式注册 Spring Converter