java spring quartz如何配置让job只运行一次?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java spring quartz如何配置让job只运行一次?相关的知识,希望对你有一定的参考价值。

<bean id="systemDataUpgradeTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="systemDataUpgradeJob" />
<!-- 5 seconds -->
<property name="startDelay" value="1000" />
<!-- repeat every 3 hours -->
<property name="repeatInterval" value="10800000" />
</bean>

我们项目是这样写的,楼主说,只运行一次,是经过某个时间定运行一次吗?还是其他什么意思?

<!-- 触发器 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail"><ref bean="methodInvokingJobDetail"/></property>
        <property name="cronExpression">
            <value>4 * * * * ?</value>
            <!--  <value>5 * * * * ?</value>-->
            <!--
             1.秒 0-59
             2.分钟 0-59
             3.小时 0-23
             4.月份中的日期 1-31
             5.月份 1-12或者Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec
             6.星期中的日期 1-7或者MON,TUE,WED,THU,FRI,SAT,SUN.
        -->         
        </property>
    </bean>
    <!-- 定时任务列表 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list><ref local="cronTrigger"/>
            </list>
        </property>
    </bean>

参考技术A 只运行一次就不需要写job了,job最好还是用 cronExpression 吧,这样控制起来比较精确 ! 参考技术B <bean id="systemDataUpgradeTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="systemDataUpgradeJob" />
        <property name="cronExpression">
            <!-- 每年的5月3日16点执行一次-->
            <value>0 0 16 3 5 ?</value>
        </property>
</bean>

可以这样去配置,用cron表达式

参考技术C 你具体是什么意思,想要多长时间执行一次?

Java Spring-Spring与Quartz整合

 

关于spring mvc、mybatis、maven的整合,请看上一篇文章

Quartz是一个强大的可以在web端执行定时任务的jar包。

 

本篇文章分为两大不同配置,第一位xml配置,第二位注解配置

 

-----下面是xml配置篇-----

1. 配置

在spring-mvc.xml文件中

下面有两种配置方式,第一种是SimpleTigger(注释),第二种是CronTiggerBean

<!-- 定時任務開始 -->
    <bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean">  
        <property name="jobClass" value="com.cjt.quartz.Job1" />  
        <property name="jobDataAsMap">  
        <map>  
            <entry key="timeout" value="5" />  
        </map>  
        </property>  
    </bean> 
    
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
        <property name="jobDetail" ref="job1" />  
        <property name="cronExpression" value="0 0/1 * * * ?" /> <!-- 每分钟运行一次 -->
    </bean>  
    
    <!-- 
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
      <property name="jobDetail" ref="job1"/>
      <property name="startDelay" value="1000"/>
      <property name="repeatInterval" value="5000"/>
    </bean> 
    -->
    
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <property name="triggers">  
            <list>  
                <ref bean="cronTrigger" />  
            </list>  
        </property>  
    </bean> 
      <!-- 定時任務結束 -->

在maven中pom.xml加入quartz的jar包(注意spring不支持quartz 2.0以上的版本)

<properties>  
    <quartz.version>1.8.5</quartz.version> 
</properties>  
<dependencies>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>${quartz.version}</version>
    </dependency>
</dependencies>

 

2. 编程

Job1.java

public class Job1 extends QuartzJobBean {
    
    private int timeout;  
    private static int i = 0;  
    //调度工厂实例化后,经过timeout时间开始执行调度  
    public void setTimeout(int timeout) {  
    this.timeout = timeout;  
    }  
      
    /** 
    * 要调度的具体任务 
    */  
    @Override  
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {  
      System.out.println("定时任务执行中…");  
    }  
}

 

-----下面是注解配置篇-----

1. 在spring-mvc.xml中加入:

    <task:annotation-driven/> 
    <context:annotation-config/>  
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>  
    <context:component-scan base-package="com.cjt.quartz"/> 

  xmlns中加入

xmlns:task="http://www.springframework.org/schema/task"

  xsi:schemaLocation中加入

http://www.springframework.org/schema/task  
http://www.springframework.org/schema/task/spring-task-3.1.xsd

 

2. 代码

package com.cjt.quartz;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class Job2 {

    @Scheduled(cron="0/5 * *  * * ? ")
    public void excute() {
        System.out.println("執行任務 Job2 excute...");
    } 
}

 

3. 加入maven包

请参照上面的xml配置篇

 

下载项目:

https://github.com/cjt321/MavenSpirngmvcMybatis

以上是关于java spring quartz如何配置让job只运行一次?的主要内容,如果未能解决你的问题,请参考以下文章

quartz中,同一个job的并发执行

Java Spring-Spring与Quartz整合

Quartz与Spring集成 Job如何自动注入Spring容器托管的对象

003-spring结合java类调用quartz

spring中如何配置shiro和quartz的问题

在spring中如何配置quartz使得quartz能动态 我邮箱:chenxing19900106@163.com