Spring 定时任务 比较

1.spring 注解类的配置:

   <!-- 加载定时任务 :
                        需要配置多线程才能不会让任务与任务之间受到影响
                        默认的配置的单线程  需要配置线程池
    -->
    <task:executor id="executor" pool-size="5" />
    <task:scheduler id="scheduler" pool-size="10" />
    <task:annotation-driven scheduler="scheduler" executor="executor"/>

2.实体类 :

package com.jmp.quarz;

import com.jmp.comm.Utils.JsonUtil;
import com.jmp.service.UserService;
import com.jmp.sql.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Random;


/**
 * spring task的特点:
         1. 默认单线程同步执行
         2. 一个任务执行完上一次之后,才会执行下一次调度
         3. 多任务之间按顺序执行,一个任务执行完成之后才会执行另一个任务
         4. 多任务并行执行需要设置线程池
         5. 全程可以通过注解配置
 */

@Component
@Slf4j
public class MySpringTaskQuarzJobs {

    @Resource
    UserService userService;

    /**
     * 定时任务方法:
     *      不一样的线程进行操作的
     *      注解式的任务,在时间延迟的时候,大于相间隔的时间进行操作的,也会执行完再执行下一个操作
     */
    @Scheduled(cron = "0/2 * * * * ? ")
    public void run(){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("run obj info : ",this.hashCode());
        log.info("MyQuarzJobs job");
    }


    /**
     * 注解式的定时任务操作:
     *     当发生异常时,任务在相应的间隔时间进行执行
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    public void runError(){
        try {
            Thread.sleep(7000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Random rand = new Random();
        int num = rand.nextInt();
        if (num % 3 == 0) {
            num = 9 / 0;
        }
        log.info("runError obj info : ",this.hashCode());
        log.info("runError job");
    }


    /**
     * 可以调用相应的服务类内容
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void runService(){
        log.info("--------> runService method <---------------");
        List<User> list = userService.getUserList();
        log.info(" json data :  {}", JsonUtil.toJson(list));
        log.info("--------> runService code : {}",this.hashCode());
        log.info("runService end");
    }



}

2.Quarz配置文件的配置方式:

quarz.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
    <!-- 要调用的工作类 -->
    <bean id="quartzJob" class="com.jmp.quarz.QuarzJobs"></bean>

    <!-- 任务配置列表 -->
    <!-- <property name="targetObject" ref="quartzJob" />--><!-- 调用的类 -->
    <!--<property name="targetMethod" value="runOne" />--> <!-- 调用类中的方法 -->
    <!--<property name="concurrent" value="false"/>--><!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
    <bean id="jobtask1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob" />
        <property name="targetMethod" value="runOne" />
        <property name="concurrent" value="false"/>
    </bean>
    <bean id="jobtask2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob" />
        <property name="targetMethod" value="runTwo" />
        <property name="concurrent" value="false"/>
    </bean>
    <bean id="jobtask3" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob" />
        <property name="targetMethod" value="runThree" />
        <property name="concurrent" value="false"/>
    </bean>

    <!-- 触发器配置  时间指定 -->
    <bean id="cronTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobtask1" />
        <!-- cron表达式 -->
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>
    <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobtask2" />
        <!-- cron表达式 -->
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>
    <bean id="cronTrigger3" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobtask3" />
        <!-- cron表达式 -->
        <property name="cronExpression" value="0/5 * * * * ?" />
    </bean>

    <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序  -->
    <bean id="startQuertz" lazy-init="false"  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger1" />
                <ref bean="cronTrigger2" />
                <ref bean="cronTrigger3" />
            </list>
        </property>
    </bean>

</beans>


 引入到spring配置文件中(application.xml中):

 <import resource="classpath:quartz.xml"/>

实体类内容:

package com.jmp.quarz;


import com.jmp.comm.Utils.JsonUtil;
import com.jmp.service.UserService;
import com.jmp.sql.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Random;

/**
 Spring Quartz 特点:【按照配置文件时间表达式:准时准点(不延时的时候)】  ---> 配置到spring application.xml上
     1. 默认多线程异步执行
     2. 一个任务在上一次调度未完成执行,下一次调度时间到时,会另起一个线程开始新的调度。在业务繁忙时,一个任务或许会有多个线程在执行,导致数据处理异常。
     3. 单任务同步:配置属性,可以使一个任务的一次调度在未完成时,而不会开启下一次调度
     4. 多个任务同时运行,任务之间没有直接的影响,多任务执行的快慢取决于CPU的性能

     一个类对应不一样的job方法并可以定义为不一样的job task任务 [看配置文件内容]

 */
@Component
@Slf4j
public class QuarzJobs {

    @Resource
    UserService userService;

    /**
    * Quarz 运行方法 :  No.1方法
    * 执行的对象是否一致  :  执行的对象是一致的
    */
    public void runOne() {
        log.info("--------> runOne method : {}",this.hashCode());
        log.info("runOne end");
    }


    /**
     * Quarz 运行方法 :  No.2方法
     * 故这个方法没有执行到  :  可以调用相应的service类内容
     */
    public void runTwo() {
        log.info("--------> runTwo method <---------------");
        List<User> list = userService.getUserList();
        log.info(" json data :  {}", JsonUtil.toJson(list));
        log.info("--------> runTwo code : {}",this.hashCode());
        log.info("runTwo end");
    }


    /**
     * Quarz 运行方法 :  No.3方法
     * 当执行error方法时 是否会继续执行任务内容
     * 发生异常的时候则继续执行相应的任务的内容
     */
    public void runThree() {
        log.info("--------> runThree method <---------------");
        Random rand = new Random();
        int num = rand.nextInt();
        if (num % 3 == 0) {
            num = 9 / 0;
        }
        log.info("--------> runThree code : {}",this.hashCode());
        log.info("runThree end");
    }


}

猜你喜欢

转载自blog.csdn.net/zuozhiyoulaisam/article/details/81491026