Spring任务执行和调度

本文介绍了Spring中TaskExecutor和TaskScheduler接口用于异步执行和任务调度的原理及其实现,包括SimpleAsyncTaskExecutor、ThreadPoolTaskExecutor等执行器的特性与使用,以及TaskScheduler的Trigger和CronTrigger实现。同时,讲解了@Scheduled和@Async注解的使用,以及通过XML命名空间配置任务调度的方法。最后,提到了Quartz Scheduler在Spring中的集成和使用。
摘要由CSDN通过智能技术生成

1 概述

Spring框架分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象。Spring还提供了这些接口的实现,这些接口支持线程池或将其委托给应用服务器环境中的CommonJ。

2 TaskExecutor

Spring 2.0 开始引入的新的抽像。Executors 是线程池的Java 5名称。之所以称作是“执行器”是因为不能保证底层实现实际上是一个池;执行程序可以是单线程的,甚至是同步的。Spring的TaskExecutor接口与java.util.concurrent是等价的。

2.1 TaskExecutor类型

SimpleAsyncTaskExecutor

线程不会重用,每次调用开启一个新的线程。支持并发,超过最大并发调用数时,会阻塞,直到释放一个槽为止。

SyncTaskExecutor

不会异步执行调用。每次调用都发生在调用线程中。它主要用于不需要多线程的情况。

ConcurrentTaskExecutor

Java 5 Java .util.concurrent. executor的包装。替代方案是ThreadPoolTaskExecutor,它将Executor配置参数作为bean属性公开。很少使用。

SimpleThreadPoolTaskExecutor

Quartz的SimpleThreadPool的一个子类,它监听Spring的生命周期回调。Quartz组件和非Quartz组件共享需要共享一个线程池时,通常会使用这种方法。

ThreadPoolTaskExecutor

只能在java5中使用。公开了用于配置java.util.concurrent的bean属性。如果需要高级的东西,比如ScheduledThreadPoolExecutor,建议使用ConcurrentTaskExecutor替代。

TimerTaskExecutor

通过TimerTask支撑实现。 不同于SyncTaskExecutor,因为方法调用在一个单独的线程中执行,尽管它们在那个线程中是同步的。

WorkManagerTaskExecutor

使用CommonJ WorkManager作为它的支持实现,并且是在Spring上下文中设置CommonJ WorkManager引用的中心便利类。与SimpleThreadPoolTaskExecutor类似,这个类实现了WorkManager接口,因此也可以直接作为WorkManager使用。

2.2 使用 TaskExecutor

 public class TaskExecutorExample {
 private class MessagePrinterTask implements Runnable {
 private String message;
 public MessagePrinterTask(String message) {
 this.message = message;
 }
 public void run() {
 System.out.println(message);
 }
 }
 private TaskExecutor taskExecutor;
 public TaskExecutorExample(TaskExecutor taskExecutor) {
 this.taskExecutor = taskExecutor;
 }
 public void printMessages() {
 for (int i = 0; i < 25; i++) {
 taskExecutor.execute(new MessagePrinterTask("Message" + i));
 }
 }
 }

与其从池中检索线程并自己执行,不如将Runnable添加到队列中,而TaskExecutor使用其内部规则来决定任务何时执行

配置TaskExecutor将使用的规则

 <bean id="taskExecutor" class="org.springframework.scheduling.concurrent
.ThreadPoolTaskExecutor">
 <property name="corePoolSize" value="5" />
 <property name="maxPoolSize" value="10" />
 <property name="queueCapacity" value="25" />
 </bean>
 <bean id="taskExecutorExample" class="cn.pconline.activity.task.TaskExecutorExample" init-method="printMessages">
 <constructor-arg ref="taskExecutor" />
 </bean>

3 TaskScheduler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值