Spring中的定时任务

以前在web应用中定时任务都是用的quartz,但Spring在3.0版本之后添加了Spring Task。


具体的配置如下:

    <task:scheduled-tasks scheduler="taskScheduler">
        <!--<task:scheduled ref="taskManager" method="print" cron="1/5 * * * * *"/>-->
        <task:scheduled ref="taskManager" method="print" fixed-rate="10000"/>
    </task:scheduled-tasks>


    <bean id="taskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"
          p:poolSize="1"
          p:errorHandler-ref="errorHandler"
          p:waitForTasksToCompleteOnShutdown="true"/>

    <bean id="errorHandler" class="org.xyz.test.service.task.TaskManager.TestExceptionHandler"/>

上面的代码是Spring的配置文件中的一部分内容,首先定义了一个任务调度器,该任务调度器不但拥有定时调度的功能,同时里面还包含一个线程池。我们来看下ThreadPoolTaskScheduler的源码:

public class ThreadPoolTaskScheduler extends ExecutorConfigurationSupport
		implements TaskScheduler, SchedulingTaskExecutor {

	private volatile int poolSize = 1;

	private volatile ScheduledExecutorService scheduledExecutor;

	private volatile ErrorHandler errorHandler;
	//省略下面的内容
}

可见该任务调度器里面是一个ScheduledExecutorService,该类是ExecutorService类的子类。关于ExecutorService类,这是java.util.concurrent包中的很重要的类,详细参见笔者以前的博客  JAVA并发-Executor任务执行框架

看了ScheduledExecutorService类的源码,那他的用法就很清晰了,首先需要指定其中的线程池的线程数数量,然后指定其他的,比如很重要的一个,如果发生异常的话怎么办?上面的配置中是为异常指定了一个异常处理类。我们来看具体的代码:

/**
 * Created by yizhenn on 16-12-17.
 */
@Service
public class TaskManager {
    public void print() throws TestException, InterruptedException {
        Random random = new Random(System.currentTimeMillis());
        int tmp = random.nextInt(5);
        System.out.println("random second=" + tmp);
        if (tmp == 1)
            throw new TestException();
        TimeUnit.SECONDS.sleep(tmp);
        System.out.println("执行定时任务");
    }

    public static class TestExceptionHandler implements ErrorHandler {
        @Override
        public void handleError(Throwable t) {
            System.out.println("定时任务发生异常,进行处理");
        }
    }

    private class TestException extends Exception {

    }
}

好了,看来使用spring task的定时任务框架还是挺简单的。关于ThreadPoolTaskScheduler这个类的属性,都是一些java.util.concurrent.*包中的类,可参见笔者的博客集 Java并发


觉得文章不错的话,就关注我吧!

具体工程代码,请见我的github!

https://github.com/ZhenShiErGe/test/pull/3/commits


笔者开设了一个知乎live,详细的介绍的JAVA从入门到精通该如何学,学什么?

提供给想深入学习和提高JAVA能力的同学,欢迎收听https://www.zhihu.com/lives/932192204248682496


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值