spring @Scheduled 并发

一.spring定时任务配置

applicationContext.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" xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:task="http://www.springframework.org/schema/task"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   <!--   定时器配置   -->
   <task:annotation-driven/>
   <task:scheduler id="myScheduler" pool-size="5"/>

  

注意事项:<task:scheduler id="myScheduler" pool-size="5"/>这段配置为非必须,配置这段的原因是spring定时任务默认是单线程的。配置了这段表示不同定时任务不论是否在同一时间点执行,任务之间互不影响(即多线程执行)。但是自己还是会影响自己。下面介绍具体问题以及解决方式。

二.测试1(不加<task:scheduler id="myScheduler" pool-size="5"/>)
方法代码:

public class QuartzServiceImpl implements QuartzService {

    //1.简易定时器-(每10秒执行一次,执行时间为20秒)
    @Scheduled(cron = "0/10 * *  * * ? ")
    public void taskA() {
        try {
            System.out.println(DateUtils.forMatDate(new Date())+"||A任务每10秒执行一次..");
            Thread.sleep(20*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //2.简易定时器-每5秒执行一次
    @Scheduled(cron="0/5 * *  * * ? ")
    public void taskB(){
        System.err.println(DateUtils.forMatDate(new Date())+"||B任务每5秒执行一次进入测试");
    }

}

  

结果:很明显A任务和B任务会相互影响。B任务正常应该是从15秒到20秒,但是20秒的时候执行了A任务(A任务又执行了20秒),因此B任务在40秒的时候再次执行。

二.测试2(加<task:scheduler id="myScheduler" pool-size="5"/>)
方法代码:同上,这次加上了<task:scheduler id="myScheduler" pool-size="5"/>这段配置

结果:上面的配置将spirng定时任务变为多线程,因此任务之间不会相互影响了。很明显A任务不再影响B任务的执行。正常的按每隔5秒钟执行一次。但是A任务是10秒钟执行一次,按理说应该41分30秒的时候执行了一次,下一次执行应该是40秒,而这里却变为了40分00秒的执行才执行。并没有按照每隔10秒钟执行一次。这也是上面我提到的加了线程池之后自己任务的执行时间会影响自己的下次执行。

三.测试3(加@Async注解)
方法代码:两个方法上面分别加了 @Async注解-即异步执行

public class QuartzServiceImpl implements QuartzService {

    //1.简易定时器-(每10秒执行一次,执行时间为20秒)
    @Scheduled(cron = "0/10 * *  * * ? ")
    @Async
    public void taskA() {
        try {
            System.out.println(DateUtils.forMatDate(new Date())+"||A任务每10秒执行一次..");
            Thread.sleep(20*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //2.简易定时器-每5秒执行一次
    @Scheduled(cron="0/5 * *  * * ? ")
    @Async
    public void taskB(){
        System.err.println(DateUtils.forMatDate(new Date())+"||B任务每5秒执行一次进入测试");
    }

  

结果:结果A任务和B任务都不会影响,并且自己也不会因为自己的执行时间过长而影响自己。

A任务每10秒正常执行一次。B任务每5秒正常执行一次。

四.总结
1.简单使用定时任务测试一即可。

2.解决并发使用测试二或测试三即可(建议使用测试二)。

原因,如果你的代码真的出现了测试三的情况,即本任务的执行时间影响了本任务的下次执行,那么你应该优化你的代码,sql语句等。而不是,让程序一直"欠费"的执行下去。

原文地址:https://www.cnblogs.com/jtlgb/p/10564622.html

时间: 2024-10-18 18:23:35

spring @Scheduled 并发的相关文章

spring @Scheduled 并发执行

spring @Scheduled ,默认基于单线程执行,如果需要基于多线程执行,需要在配置文件中配置如下 <task:scheduler id="scheduler" pool-size="10" /> <task:executor id="executor" keep-alive="7200" pool-size="100-200" queue-capacity="500&q

使用轻量级Spring @Scheduled注解执行定时任务

WEB项目中需要加入一个定时执行任务,可以使用Quartz来实现,由于项目就一个定时任务,所以想简单点,不用去配置那些Quartz的配置文件,所以就采用了Spring @Scheduled注解来实现了定时任务.在这里做个备注. spring配置文件  xmlns中加入一段: xmlns:task="http://www.springframework.org/schema/task" 然后xsi:schemaLocation多加下面的内容: http://www.springframe

分享Spring Scheduled定时器的用法

摘要:在coding中经常会用到定时器,指定每隔1个小时,或是每天凌晨2点执行一段代码段,若是使用java.util.Timer来做这种事情,未免重复造轮子.幸亏Spring中封装有定时器,而且非常好用,采用注解的形式配置某时某刻执行一段代码段.在之前的项目中使用过一次,下面就把代码.配置一并分享与大家. 关键词:Spring, JAVA, Scheduled, 定时器 一. 首先写一个Handler接口(“定时器Handler”),用以说明实现这一接口的类做的处理逻辑都是由定时器驱动的. 1

使用spring @Scheduled注解运行定时任务、

曾经框架使用quartz框架运行定时调度问题. 老大说这配置太麻烦.每一个调度都须要多加在spring的配置中. 能不能降低配置的量从而提高开发效率. 近期看了看spring的 scheduled的使用注解的方式进行调度. 感觉非常方便.起码配置的东西少了非常多. 所以留下来以备忘了. 首先要配置我们的spring.xml xmlns 多加以下的内容. xmlns:task="http://www.springframework.org/schema/task" 然后xsi:schem

Spring @Scheduled

Spring @Scheduled是Spring计划任务的一种很简洁的实现.用来替代Quartz的方案. 要使用此特性,需要Spring3.2以上版本.用法: 1.在xml的配置中,需要加入: http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd" 2.写一个简单例子: import org.springframework.context.

使用spring @Scheduled注解执行定时任务

首先要配置我们的spring.xml xmlns 多加下面的内容 1 xmlns:task="http://www.springframework.org/schema/task" 然后xsi:schemaLocation多加下面的内容 1 http://www.springframework.org/schema/task 2 http://www.springframework.org/schema/task/spring-task-3.1.xsd 最后是我们的task任务扫描注解

Spring @Scheduled关键字

备注:本示例中我们使用的是spring 4.2.5版本. 在spring的上下文文件中修改标签: 增加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-4.2.xsd

spring @Scheduled注解执行定时任务

以前框架使用quartz框架执行定时调度问题. 这配置太麻烦.每个调度都需要多加在spring的配置中. 能不能减少配置的量从而提高开发效率. 最近看了看spring的 scheduled的使用注解的方式进行调度. 感觉很方便.起码配置的东西少了很多. 所以留下来以备忘了. 首先要配置我们的spring.xml xmlns 多加下面的内容. [html] view plain copy xmlns:task="http://www.springframework.org/schema/task&

spring @Scheduled用法

@Scheduled(cron = "0 5 * * * ?") org.springframework.scheduling.annotation.Scheduled /** * Annotation that marks a method to be scheduled. Exactly one of the * <code>cron</code>, <code>fixedDelay</code>, or <code>fi