Spring 任务
2016-06-19 13:39
393 查看
引用原文地址
这样做存在一系列问题:
1. 代码可复用性极差,对于所有需要异步执行的任务,都需要自己编写新线程逻辑
2. 当用户量变大了以后,例如有10000个用户在我们的系统中同时进行
评论,那么系统中也就有10000个线程在同时执行,这很有可能就把系 统给压垮了
我们并非在代码中直接启动新线程来执行EmailTask,而是将它交给了Spring内置的Task Executor。这个TaskExecutor相当于一个线程池,它根据实际情况来决定何时执行线程池中的任务,我们可以定义同时执行线程的最大数量,这样Task Executor就可以通过类似排队的机制来解决并发量过高的问题。
为了激活Spring框架预定义的Task Executor,需要在配置中加上:
这样Spring应用上下文中就会自动配置一个任务执行器。在真正执行异步任务时,也无需我们自己显式地调用TaskExecutor和定义实现Runnable接口的任务,只需要加上@Async注解就可以了:
Spring一旦发现方法上有@Async注解,就会自动生成一个实现了Runnable接口的类,并且将它实例化后交给TaskExecutor来执行。
@Scheduled注解支持Cron表达式,同时也支持使用fixedRate属性在固定间隔来支持任务。
普通任务
1.开启线程:
public class EmailTask implements Runnable { private String message; public EmailTask(String message) { this.message = message; } public void run() { //send message } }
这样做存在一系列问题:
1. 代码可复用性极差,对于所有需要异步执行的任务,都需要自己编写新线程逻辑
2. 当用户量变大了以后,例如有10000个用户在我们的系统中同时进行
评论,那么系统中也就有10000个线程在同时执行,这很有可能就把系 统给压垮了
2.Task Executor
为了解决上述问题,Spring框架内置了任务执行器(Task Executor)来执行异步任务,执行代码如下:@Autowired private TaskExecutor taskExecutor; public void printMessages() { for(int i = 0; i < 25; i++) { taskExecutor.execute(new EmailTask("Message" + i)); } }
我们并非在代码中直接启动新线程来执行EmailTask,而是将它交给了Spring内置的Task Executor。这个TaskExecutor相当于一个线程池,它根据实际情况来决定何时执行线程池中的任务,我们可以定义同时执行线程的最大数量,这样Task Executor就可以通过类似排队的机制来解决并发量过高的问题。
为了激活Spring框架预定义的Task Executor,需要在配置中加上:
@EnableScheduling public class Application { }
这样Spring应用上下文中就会自动配置一个任务执行器。在真正执行异步任务时,也无需我们自己显式地调用TaskExecutor和定义实现Runnable接口的任务,只需要加上@Async注解就可以了:
@Async public void sendEmail() { }
Spring一旦发现方法上有@Async注解,就会自动生成一个实现了Runnable接口的类,并且将它实例化后交给TaskExecutor来执行。
定时任务
@Component public class ScheduledTasks { @Scheduled(cron = ""0 0 12 * * ?")//每天中午12点触发执行 public void reportCurrentTime() { sendEmail(); } }
@Scheduled注解支持Cron表达式,同时也支持使用fixedRate属性在固定间隔来支持任务。
相关文章推荐
- Android Manifest 用法
- android之定时器AlarmManager
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring AOP动态代理-切面
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码