Spring @Scheduled @Async联合实现调度任务

定时任务之前一直用的是quartz之类,但是注意到Spring中其实也提供了一种简单的调度注释@Scheduled,也就想尝一下鲜..

代码示意如下:

@Component
@EnableScheduling
public class AsyncTaskHandlerTask {

    @Scheduled(fixedDelay = 1000)
    public void task1() {
         //输出日志
    }

    @Scheduled(fixedDelay = 1000)
    public void task2() {
         //输出日志
    }
}

执行了一下,完全ok,日志打印正常,2个任务也都正常定时执行了.那好,添加些业务逻辑进去:

@Component
@EnableScheduling
public class AsyncTaskHandlerTask {

    @Scheduled(fixedDelay = 1000)
    public void task1() {
         while(true){
            ....
         }
    }

    @Scheduled(fixedDelay = 1000)
    public void task2() {
         while(true){
            ....
         }
     }

}

再启动,咦,奇怪了,怎么定时任务没有执行呢?倘使我之前没有输出日志试验,我可能就认为注解的用法错了呢...重新添加日志,下断点重跟了一下启动过程发现:

程序进入到while死循环后就卡死了,没有再继续启动另一个定时任务了.通过现象可知@Scheduled启动过程是一个单线程同步启动过程,故一旦中途被阻塞,会导致整个启动过程阻塞,

其余的定时任务都不会启动.这明显很奇怪,网上的教程大多数是xml配置形式,Spring的官网我这头打开又奇慢无比..但是从xml的配置形式可知需要配置一个线程池来启动定时任

务.但是Javaconfig形式的则没有说明.但是我查询到了另一个注解@Async,这个异步注解我是使用过的,可以指定线程池,打到方法上后便会以指定的线程池来执行方法.然后解决方案来了:

@Component
@EnableScheduling
public class AsyncTaskHandlerTask {

    @Scheduled(fixedDelay = 1000)
    @Async
    public void task1() {
         while(true){
            ....
         }
    }

    @Scheduled(fixedDelay = 1000)
    @Async
    public void task2() {
         while(true){
            ....
         }
     }

}

再次启动,不会再被阻塞.

时间: 2024-08-30 10:12:20

Spring @Scheduled @Async联合实现调度任务的相关文章

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

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

使用轻量级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的@Async异步执行方法

应用场景: 1.某些耗时较长的而用户不需要等待该方法的处理结果 2.某些耗时较长的方法,后面的程序不需要用到这个方法的处理结果时 在spring的配置文件中加入对异步执行的支持 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.spri

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

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注解执行定时任务

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

Spring进阶-怎样集成定时调度Quartz

在一些项目里面比如进销存系统,对一些过期图片的定时清理或者库存不足发出预警提示,就需要用到定时调度技术. 每当经过一段时间,程序会自动执行,就是定时调度.如果要使用定时调度,则必须保证程序始终运行才行哦,也就是说定时调度是在程序之外又启动了一个新的线程.那么怎样才能实现定时调度呢? 方案一:可以使用JDK自带的java.util.Timer对象.可以创建定制的timer或者调用某些方法的timer.包装timer的工作由Spring TimerFactoryBean完成,不过这种方法不能准确设置

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

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