1、Spring异步任务
开启异步配置(@EnableAsync注解指定或<task:annotation-driven>标签配置)
1、用Java注解:
第一步:在类的申明前使用@EnableAsync注解开启异步调用功能。
第二步:public AsyncTaskExecutor taskExecutor() 方法自定义自己的线程池,线程池前缀”Anno-Executor”。如果不定义,则使用系统默认的线程池。
@EnableAsync // 启动异步调用 public class AsyncApplicationWithAnnotation { /* 略 */ /** * 自定义异步线程池 * @return */ @Bean public AsyncTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setThreadNamePrefix("Anno-Executor"); executor.setMaxPoolSize(10); // 设置拒绝策略 executor.setRejectedExecutionHandler(new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { // ..... } }); return executor; } }
2、用XML配置:
第一步:使用<task:executor>标签定义线程池
第二步:使用<task:annotation-driven>标签启动异步线程池配置
如下spring-async.xml配置:
<!-- 等价于 @EnableAsync, executor指定线程池 --> <task:annotation-driven executor="xmlExecutor"/> <!-- id指定线程池产生线程名称的前缀 --> <task:executor id="xmlExecutor" pool-size="5-25" queue-capacity="100" keep-alive="120" rejection-policy="CALLER_RUNS"/>
有关线程池的拒绝策略,参考下文:
线程池--拒绝策略RejectedExecutionHandler
编写异步任务(@Async注解指定)
1、编写普通Java类,并设置方法为@Async注解
只需要简单这么一步即可在执行注解方法时自动由Spring框架执行异步操作。
p
ackage tech.bbwang.springtask.scheduled.demo; import org.springframework.stereotype.Component; import java.util.Date; @Component public class ScheduledTaskExample { public ScheduledTaskExample(){ } @Async public void printTime(){ System.out.println((new Date()).toString()); } }
2、线程池
配置线程池
最简单的形式,只需要在spring配置文件里加一条配置即可。
<task:executor id="xmlExecutor" pool-size="2" />
添加此配置需要在Spring配置文件的<beans>头部添加下面的约束文件(task相关处的命名空间)
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
使用线程池
线程池xmlExecutor作为一个Spring的bean存在,可以被注入到需要的地方。
比如:
定义一个使用线程池的类TaskExecutorExample,该类使用线程池跑10个打印当前时间的任务。
package tech.bbwang.springtask.demo; import org.springframework.core.task.TaskExecutor; import org.springframework.stereotype.Component; import tech.bbwang.App; import java.util.HashMap; import java.util.Map; /** * 任务执行样例 */ @Component public class TaskExecutorExample { private TaskExecutor taskExecutor; public TaskExecutorExample(TaskExecutor taskExecutor) { this.taskExecutor = taskExecutor; } public void printMessages() { for(int i = 0; i <10; i++) { taskExecutor.execute(new Runnable(){ public void run(){ System.out.println((new Date()).toString()); } }); } } }
Spring配置文件设置:
<?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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="tech.bbwang.springtask.demo"/> <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="tech.bbwang.springtask.demo.TaskExecutorExample"> <constructor-arg ref="taskExecutor" /> </bean> </beans>
3、定时器和定时任务
定义定时器
spring配置文件:
<!-- pool-size:此参数默认为1,此时,不同的定时任务不可同时进行,因为线程数不够。需要自己设置>1的数值来保证,同一个定时任务前一个未完成情况下不启动下一个,但不用的定时任务可以同时进行--> <task:scheduler id="taskScheduler" pool-size="10"/>
定义定时任务
spring配置文件:
<task:scheduled-tasks> <!-- 配置定时任务,cron=一秒一次--> <task:scheduled ref="scheduledTaskExample" method="printTime" cron="0/5 * * * * ?"/> <!-- 配置定时任务,cron=每日0时和12时各执行一次任务--> <!--Cron表达式生成器 http://www.pdtools.net/tools/becron.jsp--> <!--<task:scheduled ref="scheduledTaskExample" method="printTime" cron="0/1 0/1 0,12 * * ?"/>--> </task:scheduled-tasks>
有关corn表达式可以参考:
定义定时任务类
package tech.bbwang.springtask.scheduled.demo; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.Date; @Component public class ScheduledTaskExample { public ScheduledTaskExample(){ } @Async public void printTime(){ System.out.println((new Date()).toString()); } }
定义运行类
其实已经完全由Spring配置解决了运行问题,只需要给一个运行Spring配置的主函数即可。
package tech.bbwang; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.concurrent.CountDownLatch; public class SpringAsyncTask { public static void main( String[] args ) { new ClassPathXmlApplicationContext("spring-async*.xml"); } }
相关推荐
基于Spring中的线程池和定时任务功能解析 Spring框架提供了线程池和定时任务执行的抽象接口:TaskExecutor和TaskScheduler来支持异步执行任务和定时执行任务功能。TaskExecutor是一个抽象接口,定义了execute方法,...
在Spring框架中,定时任务是通过Spring Task模块来实现的,它提供了强大的任务调度和执行功能,能够方便地实现应用程序中的周期性任务。本篇将详细介绍如何配置和使用Spring的定时器来定时调用任务。 首先,让我们...
本教程将深入探讨如何配置并实现Spring Boot中的定时任务,包括线程配置、并行同步和异步执行等关键概念。 首先,我们需要了解Spring Boot中的定时任务基础。通过添加`@EnableScheduling`注解到某个配置类,我们...
在Spring 3.0 MVC框架中,定时器和多线程任务是两个关键概念,用于构建高效、自动化的Web应用程序。下面将详细讲解这两个概念及其在实际应用中的使用。 一、Spring 3.0 MVC定时器 在Spring 3.0中,我们可以使用...
在IT领域,线程池和定时器是两个关键的概念,它们在系统性能优化和任务调度中扮演着重要角色。ThreadPoolTaskScheduler是Spring框架提供的一种线程池实现,它被设计用于执行定时任务,而Quartz则是一个流行的任务...
这个实例,"spring定时器实例",显然关注的是如何在Spring中实现定时任务。下面我们将深入探讨Spring中的任务调度机制以及如何创建和配置定时任务。 Spring提供了两种主要的调度组件:`org.springframework....
Java定时器结合Spring框架可以创建灵活且可扩展的定时任务,这种技术在许多企业级应用中非常常见,用于执行周期性的后台任务,如数据清理、报告生成或服务调用等。下面将详细介绍如何在Spring中集成Java定时器,并...
这个"spring 定时器的 .jar包"显然包含了用于在Spring环境中实现定时任务的关键组件。让我们详细了解一下Spring中的定时任务机制及其相关的库。 Spring提供了一个名为`Spring Task`的模块,也称为Spring调度器,它...
Spring定时器,全称为Spring Framework中的Task Execution and Scheduling模块,是Spring提供的一种用于执行计划任务的工具。这个模块使得开发者能够方便地在应用程序中安排周期性任务,而无需依赖像Quartz或Cron...
Spring定时器,全称为Spring Framework中的Task Execution and Scheduling模块,是Spring提供的一个强大而灵活的任务调度框架。它允许开发者在应用中安排周期性任务的执行,无需直接依赖底层的调度实现,如 Quartz ...
Spring定时器,也被称为Spring Task或者Spring Batch,是Spring框架的一部分,用于实现应用程序中的定时任务。这个功能在企业级应用中非常常见,例如定期备份、数据清理、日志归档等。Spring定时器通过集成Quartz或...
此外,Spring还提供了对任务调度的支持,比如通过`ThreadPoolTaskScheduler`实现基于线程池的定时任务调度,它可以与`TaskExecutor`一起使用,提供灵活的任务调度能力。这使得应用程序能够在指定的时间间隔执行周期...
1. `ThreadPoolTaskScheduler`:Spring提供的一个线程池调度器,可以用于更复杂、异步的任务调度。首先,我们需要配置一个`ThreadPoolTaskScheduler`实例: ```xml <bean id="taskScheduler" class="org.spring...
- Spring Boot中也可以使用`@Async`注解配合`@EnableAsync`实现异步任务,虽然这不是真正意义上的定时任务,但可以用于并发执行。 5. **分布式定时任务**: - 在分布式环境下,如集群环境,单节点的定时任务可能...
Spring定时器,也被称为Spring Task或者Spring Batch,是Spring框架的一部分,用于实现应用程序中的定时任务。这个简单demo可能展示了如何在Spring应用中设置和运行定时任务,以帮助开发者自动化执行某些周期性工作...
在Spring 3.1中,可以通过`ThreadPoolTaskExecutor`和`ThreadPoolTaskScheduler`实现这两个接口,以创建线程池来处理定时任务。 为了配置Spring 3.1的定时器,我们需要添加相关的依赖到项目的Maven pom.xml文件中。...
在Java应用中,我们经常需要执行一些后台任务,比如数据清理、日志备份或者定期同步数据,这时Spring定时器就派上用场了。这个"spring定时器例子"是一个针对初学者的教程,旨在帮助他们理解和使用这一功能。 Spring...
Spring框架提供了丰富的定时任务支持,使得在Java环境中实现定时器变得更加简单和灵活。本篇文章将深入探讨如何在Spring中实现定时任务调度。 首先,我们需要了解Spring的`TaskScheduler`接口和`...
Spring定时器,全称为Spring Framework中的Task Execution and Scheduling模块,是Spring框架提供的一种用于执行定时任务的强大工具。它允许开发者在应用中设置定时任务,实现周期性操作,如数据同步、日志清理、...
在Java开发中,Spring框架是不可或缺的一部分,尤其在...以上就是使用Spring实现定时器的基础知识,通过理解并实践这些内容,初学者可以轻松地在自己的项目中集成定时任务功能。希望这对你在Spring开发之路上有所帮助。