shuytu 2014-09-10 08:59 采纳率: 0%
浏览 2350

spring mvc 开发模式下,使用Quartz如何实现

<? xml version="1.0" encoding="UTF-8" ?>

<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >

< beans >

<!-- 起动Bean -->

< bean id ="mytask" class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >

< property name ="triggers" >

< list >

< ref bean ="cronReportTrigger" />

</ list >

</ property >

</ bean >

<!-- 实际的工作Bean -->

< bean id ="TaskDetail" class ="test.TaskDetail" >
</ bean >

<!-- jobBean用于设定启动时运用的Bean与方法 -->

< bean id ="scheduledReportJobDetail" class ="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >

< property name ="targetObject" >

< ref bean ="TaskDetail" />

</ property >

< property name ="targetMethod" >

< value > sendTaskDetailMessage</ value >

</ property >

</ bean >

<!-- 定时器设定起动频率&启动时间我设的是每5秒起动一次 (0 0 4 * * ?每日四点起动.) -->

< bean id ="cronReportTrigger" class ="org.springframework.scheduling.quartz.CronTriggerBean" >

< property name ="jobDetail" >

< ref bean ="scheduledReportJobDetail" />

</ property >

< property name ="cronExpression" >

< value > 10,40 * * * * ? </ value >

</ property >

</ bean >

</ beans >]

程序能够找到mytask里面的方法,也能实现定时执行,如果mytask仅仅只是执行sendTaskDetailMessage方法,且方法里只有打印语句不会出任何问题。从某总程度上来说定时执行的功能可以实现。
但是在Spring mvc模式下,我的controller里面的方法中涉及到@注释注入的Service,通过Service来执行程序,导致Service一直报空指针异常!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 14:21
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Spring MVC模式下,你可以将你的定时任务放在Controller或视图控制器中,因为它们是处理请求和响应的主要组件。然而,如果你想要一个独立的任务管理工具,你可以考虑使用其他框架,如Quartz Scheduler。

    以下是一个使用Quartz Scheduler的例子:

    <beans>
    
        <!-- 创建一个新的Quartz Scheduler实例 -->
        <bean id="scheduler" class="org.quartz.simpl.SimpleScheduler">
            <property name="quartzProperties">
                <props>
                    <prop key="org.quartz.scheduler.instanceName">yourSchedulerInstance</prop>
                    <prop key="org.quartz.jobStore.type">disk</prop>
                    <prop key="org.quartz.jobStore.path">/path/to/jobstore</prop>
                </props>
            </property>
        </bean>
    
        <!-- 将定时任务添加到Scheduler中 -->
        <bean id="jobDefinition" class="org.quartz.simpl.JobBuilderImpl">
            <property name="group" value="YourGroup"/>
            <property name="name" value="YourJobName"/>
            <property name="class" value="com.yourcompany.YourClassName"/>
        </bean>
    
        <!-- 添加新的任务到Scheduler中的队列 -->
        <bean id="newJob" class="org.quartz.simpl.TriggerBuilderImpl">
            <property name="group" value="YourGroup"/>
            <property name="name" value="YourJobName"/>
            <property name="jobDataMap">
                <map>
                    <entry key="param1" value="value1"/>
                    <entry key="param2" value="value2"/>
                </map>
            </property>
            <property name="startAt" value="0"/>
            <property name="endAt" value="10"/>
            <property name="repeatCount" value="0"/>
            <property name="schedule" value="FREQ=PT1M;COUNT=30"/>
            <property name="timeZone" value="UTC"/>
        </bean>
    
        <!-- 指定触发器 -->
        <bean id="triggerDefinition" class="org.quartz.simpl.TriggerBuilderImpl">
            <property name="group" value="YourGroup"/>
            <property name="name" value="YourJobName"/>
            <property name="triggerName" value="YourTriggerName"/>
            <property name="class" value="org.quartz.simpl.TriggerBuilderImpl"/>
            <property name="jobKey" value="YourJobName"/>
        </bean>
    
        <!-- 将新的触发器添加到Scheduler中 -->
        <bean id="newTrigger" class="org.quartz.simpl.TriggerBuilderImpl">
            <property name="group" value="YourGroup"/>
            <property name="name" value="YourJobName"/>
            <property name="jobKey" value="YourJobName"/>
            <property name="triggerName" value="YourTriggerName"/>
            <property name="schedule" value="FREQ=DAILY;INTERVAL=1;DOW=SUN;WKST=WEDNESDAY"/>
            <property name="timezone" value="UTC"/>
        </bean>
    
    </beans>
    

    注意:以上示例中,我们创建了一个名为YourGroup的组,然后为这个组创建了两个不同的触发器和任务定义。你可能需要根据你的实际需求调整这些值。

    另外,你需要确保你的应用程序有足够的权限来运行Quartz Scheduler,并且Quartz Scheduler已经正确配置并且安装在你的系统上。

    评论

报告相同问题?