Java课程实验 Spring Boot 任务管理(下)

简介: Java课程实验 Spring Boot 任务管理(下)

7.编写service类,完成无返回值的异步方法。

1.     @GetMapping("/sendSMS")
2. 
3.     public String sendSms() throws Exception{
4. 
5.         System.out.println("***********主方法开始运行***********");
6. 
7.         Long timeStart = System.currentTimeMillis();
8. 
9.         asynService.sendSMS();
10. 
11.         Long timeEnd = System.currentTimeMillis();
12. 
13.         System.out.println("***********主方法结束运行--异步调用业务逻辑耗时"+(timeEnd-timeStart)+"***********");
14. 
15.         return "success";
16. 
17.     }

8.编写controller类,添加sendCallback方法,调用有返回值的service方法。

1. @GetMapping("/sendcb")
2. 
3.     public String sendCallback() throws Exception{
4. 
5.         System.out.println("***********主方法开始运行***********");
6. 
7.         Long timeStart = System.currentTimeMillis();
8. 
9.         Future<Integer> resultA = asynService.processA();
10. 
11.         Future<Integer> resultB = asynService.processB();
12. 
13.         Long timeEnd = System.currentTimeMillis();
14. 
15.         System.out.println("***********主方法结束运行--异步调用2个业务逻辑耗时"+(timeEnd-timeStart)+"***********");
16. 
17.         System.out.println("processA返回值:"+resultA.get()+"*****processB返回值:"+resultB.get()+"******主方法结束运行--异步调用2个业务逻辑耗时"+(timeEnd-timeStart)+"***********");
18. 
19.         return "success";
20. 
21.     }

1. @Async//有返回值的被调用方法
2. 
3.     public Future<Integer> processA() throws Exception{
4. 
5.         System.out.println("C有返回值***********耗时的业务逻辑开始被调用***********");
6. 
7.         Long timeStart = System.currentTimeMillis();
8. 
9.         Thread.sleep(25*1000);//模拟一个耗时的操作
10. 
11.         Long timeEnd = System.currentTimeMillis();
12. 
13.         System.out.println("D有返回值***********耗时的业务逻辑结束被调用--耗时:"+(timeEnd-timeStart)+"***********");
14. 
15.         return new AsyncResult<Integer>(8000);
16. 
17.     }
18. 
19.     @Async//有返回值的被调用方法
20. 
21.     public Future<Integer> processB() throws Exception{
22. 
23.         System.out.println("E有返回值***********耗时的业务逻辑开始被调用***********");
24. 
25.         Long timeStart = System.currentTimeMillis();
26. 
27.         Thread.sleep(20*1000);//模拟一个耗时的操作
28. 
29.         Long timeEnd = System.currentTimeMillis();
30. 
31.         System.out.println("F有返回值***********耗时的业务逻辑结束被调用--耗时:"+(timeEnd-timeStart)+"***********");
32. 
33.         return new AsyncResult<Integer>(8000);
34. 
35.     }

9.编写service类,完成有返回值的异步方法。

1.   @GetMapping("/sendcb")
2. 
3.     public String sendCallback() throws Exception{
4. 
5.         System.out.println("***********主方法开始运行***********");
6. 
7.         Long timeStart = System.currentTimeMillis();
8. 
9.         Future<Integer> resultA = asynService.processA();
10. 
11.         Future<Integer> resultB = asynService.processB();
12. 
13.         Long timeEnd = System.currentTimeMillis();
14. 
15.         System.out.println("***********主方法结束运行--异步调用2个业务逻辑耗时"+(timeEnd-timeStart)+"***********");
16. 
17.         System.out.println("processA返回值:"+resultA.get()+"*****processB返回值:"+resultB.get()+"******主方法结束运行--异步调用2个业务逻辑耗时"+(timeEnd-timeStart)+"***********");
18. 
19.         return "success";
20. 
21.     }

10.测试、分析 有返回值异步方法与无返回值异步方法的区别。

有返回值的异步方法和无返回值的异步方法主要区别在于其返回值的类型不同。

无返回值的异步方法一般不返回任何值,通常用于执行一些异步操作,不需要返回结果。在该类型的异步方法中,通常使用回调函数的方式处理异步操作的结果。

有返回值的异步方法用来执行某些计算任务,它们通常会返回一个结果,因此需要使用某个值类型来定义返回值。有返回值的异步方法通常由调用者调用时使用接口来获取计算结果,或者通过回调函数的方式处理异步操作的结果。

总的来说,无返回值的异步方法适用于执行一些无需返回结果的异步操作,有返回值的异步方法适用于执行一些需要计算并返回结果的异步操作。两者之间的主要区别在于返回值的类型以及处理方式的不同。

11.编写计划任务,访问tushare的Http接口,定时获取数据,并进行测试

1. public class NetRequest {
2. 
3.     public static JSONObject sendPost(String url,JSONObject jsonParam) throws Exception {
4. 
5.         OutputStream out = null;
6. 
7.         BufferedReader in = null;
8. 
9.         StringBuilder result = new StringBuilder();
10. 
11.         HttpURLConnection conn = null;
12. 
13.         try {
14. 
15.             // 创建url资源
16. 
17.             URL url_ = new URL(url);
18. 
19.             // 建立http连接
20. 
21.             conn = (HttpURLConnection) url_.openConnection();
22. 
23.             // 设置传递方式
24. 
25.             conn.setRequestMethod("POST");
26. 
27.             // 设置允许输入、允许输出
28. 
29.             conn.setDoInput(true);
30. 
31.             conn.setDoOutput(true);
32. 
33.             // 设置不用缓存
34. 
35.             conn.setUseCaches(false);
36. 
37.             //设置连接超时时间和读取超时时间
38. 
39.             conn.setConnectTimeout(30000);
40. 
41.             conn.setReadTimeout(10000);
42. 
43.             // 转换为字节数组
44. 
45.             byte[] data = (jsonParam.toString()).getBytes();
46. 
47.             // 设置文件长度
48. 
49.             conn.setRequestProperty("Content-Length", String.valueOf(data.length));
50. 
51.             // 设置文件类型:
52. 
53.             conn.setRequestProperty("contentType", "application/json");
54. 
55.             // 开始连接请求
56. 
57.             conn.connect();
58. 
59.             out = new DataOutputStream(conn.getOutputStream()) ;
60. 
61.             // 写入请求的字符串(此时jsonParam数据是放在了请求正文body里)
62. 
63.             out.write((jsonParam.toString()).getBytes());
64. 
65.             out.flush();
66. 
67.             out.close();
68. 
69.             // 请求返回的状态
70. 
71.             if (HttpURLConnection.HTTP_OK == conn.getResponseCode()){
72. 
73.                 // System.out.println("连接成功");
74. 
75.                 // 请求返回的数据
76. 
77.                 InputStream in1 = conn.getInputStream();
78. 
79.                 try {
80. 
81.                     String readLine=new String();
82. 
83.                     BufferedReader responseReader=new BufferedReader(new InputStreamReader(in1,"UTF-8"));
84. 
85.                     while((readLine=responseReader.readLine())!=null){
86. 
87.                         result.append(readLine).append("\n");
88. 
89.                     }
90. 
91.                     responseReader.close();
92. 
93.                 } catch (Exception e1) {
94. 
95.                     e1.printStackTrace();
96. 
97.                 }
98. 
99.             } else {
100. 
101.                 System.out.println("ResponseCode is an error code:" + conn.getResponseCode());
102. 
103.             }
104. 
105. 
106. 
107.         } catch (Exception e) {
108. 
109.             throw new Exception(e);
110. 
111.         }finally {
112. 
113.             try{
114. 
115.                 if(out != null){
116. 
117.                     out.close();
118. 
119.                 }
120. 
121.                 if(in != null){
122. 
123.                     in.close();
124. 
125.                 }
126. 
127.             }catch (IOException ioe){
128. 
129.                 ioe.printStackTrace();
130. 
131.             }
132. 
133.         }
134. 
135.         return JSONObject.parseObject(result.toString());
136. 
137.     }
138. 
139.     public static void main( String[] args ) throws Exception {
140. 
141.         JSONObject jsonParam = new JSONObject();
142. 
143.         jsonParam.put("para1", "para1");
144. 
145.         jsonParam.put("para2", "para2");
146. 
147.         jsonParam.put("para3", "para3");
148. 
149.         String url="http://api.tushare.pro";
150. 
151.         JSONObject data = sendPost(url,jsonParam);
152. 
153.         System.out.println(data);
154. 
155.     }
156. 
157. }

1. //获取互联网上接口的数据
2. @Scheduled(fixedRate = 60000)
3. public void getFianceData() throws Exception {
4. JSONObject jsonObject = new JSONObject();
5.         jsonObject.put("api_name","trade_cal");
6.         jsonObject.put("token","43a324154682799b54d2a59ecbd2fc8a16a8e2949cb4fb4551277455");
7. 
8. JSONObject jsonObject1 = new JSONObject();
9.         jsonObject1.put("exchange","");
10.         jsonObject1.put("start_date","20180910");
11.         jsonObject1.put("end_date","20181001");
12.         jsonObject1.put("is_open","0");
13.         jsonObject1.put("params",jsonObject1);
14.         jsonObject.put("filed","exchange,cal_data,is_open,pretrade_date");
15. JSONObject result = NetRequest.sendPost("http://api.tushare.pro",jsonObject);
16.         System.out.println(result);
17.     }

四、实验中遇到的问题及采取的措施(10分)

报错1:{"msg":"抱歉,您没有访问该接口的权限,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108。","code":40203,"message":"抱歉,您没有访问该接口的权限,权限的具体详情访问:https://tushare.pro/document/1?doc_id=108。"}

排错过程1:

检查 API 接口权限:阅读 Tushare API 接口文档并查询具体接口的相关权限要求,确认自己是否满足访问该接口的条件,例如 Token 权限、调用策略等;

更新 Token 权限:如果您已经具有 Token 权限,但是访问某个 API 接口时出现了权限错误,那么可能需要查看您的 Token 权限是否满足该接口的要求,如果不满足,需要重新申请升级 Token 权限。可以在 Tushare 平台的“个人中心”页面查看 Token 权限和使用情况,进行相应的更新;

联系 Tushare 客服:如果以上方法都无法解决问题,可以联系 Tushare 客服,询问具体的错误原因和解决方法,以确保能够正确访问 API 接口获取数据。

原因分析1:

这个错误通常表示您尝试访问 Tushare 平台的某个 API 接口时没有相关的访问权限,根据错误信息,您可以访问提供的链接查看该 API 接口的具体权限要求和访问方式。

注:由于源码量过多,需要的朋友可在资源中下载,也可私信我拿取!

目录
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
19天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
6天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
52 13
|
14天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
109 2
|
1月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
45 0
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
39 0