注:实践内容参考人民邮电出版社的教程《 Spring Boot企业级开发教程》作者:黑马程序员,上传本文仅以实践过程以供大家共同学习解决问题,如有侵权不当行为,请告知后,我会更正或删除。
Spring Boot任务管理
1 异步任务
1.1 无返回值异步任务调用
这里使用Spring Boot框架,结合使得异步任务调用的方式来演示项目向新注册用户发送短信验证码的场景需求,进一步说明无返回值的异步任务调用。
-
1.使用Sping Initializr创建Spring Boot项目,选择Web依赖(Spring Boot整合 了异步任务,只需在项目中引入Web模块,然后完成项目创建。如图:
-
2.编写异步调用方法
在com.itheima创建service的包,并创建一个业务实现类MyAsyncService,在该类中模拟编写用户短信验证码发送的方法,内容如下:
@Service public class MyAsyncService { /** * 模拟无返回值的异步任务处理 */ @Async //@Async 注解标明下面的方法为异步方法 public void sendSMS() throws Exception {//sendSMS()模拟用户短信验证码发送功能 System.out.println("调用短信验证码业务方法..."); Long startTime = System.currentTimeMillis(); //System.currentTimeMillis()在java中是最常用的获取系统时间的方法,它返回的是1970年1月1日0点到现在经过的毫秒数 Thread.sleep(5000);//是将当前线程休眠5秒,用来模拟业务调用处理的时间 Long endTime = System.currentTimeMillis();//获取当前系统时间 System.out.println("短信业务执行完成耗时:" + (endTime - startTime));//计算业务处理耗时 } }
-
3.开启基于注解的异步任务支持
上述业务实现类,使用了@Async注解标记了异步方法,还需要使用@EnableAsync注解开启基于注解的异步任务支持。如图,这里添加到项目启动类上。
-
4.编写控制层业务调用方法
在com.itheima下创建包controller,在该包下创建一个异步方法调用的实现类MyAsyncController,在该类模拟用户短信验证码发送的处理方法。内容如下:
@RestController public class MyAsyncController { @Autowired private MyAsyncService myAsyncService; @GetMapping("/sendSMS")//设置请求访问路径为"/sendSMS" public String sendSMS() throws Exception { Long startTime = System.currentTimeMillis();//获取业务处理开始时当前系统时间 myAsyncService.sendSMS();//调用业务实现对象的sendSMS()模拟短信发送业务 Long endTime = System.currentTimeMillis();//获取业务处理结束时的当前系统时间 System.out.println("主流程耗时: "+(endTime-startTime));//计算业务耗时 return "success"; } }
-
5.运行项目启动类,浏览器两次访问 :http://localhost:8080/sendSMS,效果 如图:
1.2 有返回值异步任务调用
这里演示一个程序中需要调用两个业务方法对相关业务数据统计分析,并将统计结果汇总,进一步说明有返回值 的异步任务调用。
-
1.编写异步调用方法
在之前创建 的MAsyncService异步任务处理类中,添加两个模拟有返回值的异步任务业务处理方法,代码如下:
/** * 模拟有返回值的异步任务处理 */ @Async //标明下面的方法为异步方法 public Future<Integer> processA() throws Exception { System.out.println("开始分析并统计业务A数据..."); Long startTime = System.currentTimeMillis(); Thread.sleep(4000);//是将当前线程休眠4秒,用来模拟统计业务A数据的时间 // 模拟定义一个假的统计结果 int count=123456; Long endTime = System.currentTimeMillis(); System.out.println("业务A数据统计耗时:" + (endTime - startTime)); return new AsyncResult<Integer>(count);//封装返回的结果数据 } @Async //标明下面的方法为异步方法 public Future<Integer> processB() throws Exception { System.out.println("开始分析并统计业务B数据..."); Long startTime = System.currentTimeMillis(); Thread.sleep(5000);//是将当前线程休眠4秒,用来模拟统计业务B数据的时间 // 模拟定义一个假的统计结果 int count=654321; Long endTime = System.currentTimeMillis(); System.out.println("业务B数据统计耗时:" + (endTime - startTime)); return new AsyncResult<Integer>(count); }
-
2.编写控制层业务调用方法
在之前创建 的MyAsyncController异步任务处理 类中,编 写业务数据分析统计的请求处理方法.代码如下:
@GetMapping("/statistics") public String statistics() throws Exception { Long startTime = Sys