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 接口的具体权限要求和访问方式。

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

目录
相关文章
|
3月前
|
资源调度 安全 Java
Java 大数据在智能教育在线实验室设备管理与实验资源优化配置中的应用实践
本文探讨Java大数据技术在智能教育在线实验室设备管理与资源优化中的应用。通过统一接入异构设备、构建四层实时处理管道及安全防护双体系,显著提升设备利用率与实验效率。某“双一流”高校实践显示,设备利用率从41%升至89%,等待时间缩短78%。该方案降低管理成本,为教育数字化转型提供技术支持。
88 1
|
3月前
|
消息中间件 机器学习/深度学习 Java
java 最新技术驱动的智能教育在线实验室设备管理与实验资源优化实操指南
这是一份基于最新技术的智能教育在线实验室设备管理与实验资源优化的实操指南,涵盖系统搭建、核心功能实现及优化策略。采用Flink实时处理、Kafka消息队列、Elasticsearch搜索分析和Redis缓存等技术栈,结合强化学习动态优化资源调度。指南详细描述了开发环境准备、基础组件部署、数据采集与处理、模型训练、API服务集成及性能调优步骤,支持高并发设备接入与低延迟处理,满足教育机构数字化转型需求。代码已提供下载链接,助力快速构建智能化实验室管理系统。
126 44
|
3月前
|
IDE Java 数据库连接
解决Java环境中无法识别org.mybatis.spring.annotation.MapperScan的问题。
祝你好运,在这场MyBatis的魔法冒险中获得胜利!记住,魔法书(官方文档)永远是你最好的朋友。
257 18
|
2月前
|
分布式计算 Java 大数据
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
130 2
|
2月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
98 2
|
3月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
155 1
|
3月前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
250 0
|
3月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
371 0

热门文章

最新文章