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

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

目录
相关文章
|
13天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
9 2
|
21天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
41 1
Spring 框架:Java 开发者的春天
|
14天前
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
21天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
16天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
21天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
51 2
|
25天前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
32 1
|
28天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
117 1
|
8天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
14 0