場景
Springboot+FastJson實現解析第三方http接口json數據為實體類(時間格式化轉換、字段包含中文):
Springboot+FastJson實現解析第三方http接口json數據為實體類(時間格式化轉換、字段包含中文)-CSDN博客
Java中ExecutorService線程池的使用(Runnable和Callable多線程實現):
Java中ExecutorService線程池的使用(Runnable和Callable多線程實現)_executorservice executorservice = executors.newfix-CSDN博客
Java中創建線程的方式以及線程池創建的方式、推薦使用ThreadPoolExecutor以及示例:
Java中創建線程的方式以及線程池創建的方式、推薦使用ThreadPoolExecutor以及示例_threadpoolexecutor創建線程-CSDN博客
在上面的基礎上,需要使用定時任務高頻調用典第三方http接口并解析返回的json數據為java的list,需要對
list的每個數據進行處理,這里需要用到自定義線程池對每個java對象分別進行處理。
注:
博客:
霸道流氓氣質_C#,架構之路,SpringBoot-CSDN博客
實現
1、首先在配置文件中添加第三方接口的url
這里是yml文件
?
test:#測試多線程請求http接口并解析數據http-request-executor:url: http://127.0.0.1:4523/m1/2858210-0-default/testFastJson?
2、新建定時任務類
使用@PostConstruct注解初始化需要的數據,比如獲取配置文件中的接口的url以及初始化線程池
??? @PostConstructpublic void initData() {HttpRequestExecutorTestHandler.newFixedThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() / 2);url = Objects.requireNonNull(environment.getProperty("test.http-request-executor.url"));}
這里讀取配置文件需要引入
??? @Resourceprivate Environment environment;
然后新建定時任務調用接口,并解析接口返回的json數據,將響應的data字段傳給
具體處理數據的類
?@Scheduled(fixedRateString = "1000")public void taskGetData() {String body = "";try {body = HttpRequest.get("http://127.0.0.1:4523/m1/2858210-0-default/testFastJson").timeout(20000).execute().body();UserResDTO userResDTO = JSON.parseObject(body, UserResDTO.class);if (userResDTO.getCode() != null && 200!=userResDTO.getCode()) {//錯誤處理}else {JSONArray data = userResDTO.getData();if (StringUtils.isEmpty(data)) {return;}handler.handleData(data);}} catch (Exception e) {}}?
定時任務類完整實例代碼
?
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.test.dto.UserResDTO;
import com.ruoyi.web.handle.HttpRequestExecutorTestHandler;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Objects;
import java.util.concurrent.Executors;@Component("HttpRequestExecutorTestTask")
@EnableScheduling
public class HttpRequestExecutorTestTask {private String url;@Resourceprivate Environment environment;@Resourceprivate HttpRequestExecutorTestHandler handler;/*** 初始化URL數據*/@PostConstructpublic void initData() {HttpRequestExecutorTestHandler.newFixedThreadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() / 2);url = Objects.requireNonNull(environment.getProperty("test.http-request-executor.url"));}@Scheduled(fixedRateString = "1000")public void taskGetData() {String body = "";try {body = HttpRequest.get("http://127.0.0.1:4523/m1/2858210-0-default/testFastJson").timeout(20000).execute().body();UserResDTO userResDTO = JSON.parseObject(body, UserResDTO.class);if (userResDTO.getCode() != null && 200!=userResDTO.getCode()) {//錯誤處理}else {JSONArray data = userResDTO.getData();if (StringUtils.isEmpty(data)) {return;}handler.handleData(data);}} catch (Exception e) {}}
}?
3、上面具體進行業務處理的類
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.system.domain.test.dto.UserDTO;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.ExecutorService;@Component
public class HttpRequestExecutorTestHandler {public static ExecutorService newFixedThreadPool;public void handleData(JSONArray data) {List<UserDTO> userDTOS = data.toJavaList(UserDTO.class);for (UserDTO userDTO:userDTOS) {newFixedThreadPool.execute(() -> mapperApiData(userDTO));}}//具體業務處理private void mapperApiData(UserDTO userDTO){System.out.println(userDTO);}}
將接收到的data字段解析成java的list,然后遍歷list,每個對象用一個線程具體去處理。
附接口示例數據
{"code": "200","data": [{"id": "63","name": "學指約思但","time_cur": "2009-07-23 02:14:52","地址": "minim sint commodo nisi"},{"id": "19","name": "下農前清時相","time_cur": "2013-10-16 17:32:09","地址": "ullamco aliqua"},{"id": "57","name": "米見放層張圓","time_cur": "2015-10-20 18:40:42","地址": "dolor minim et qui"}]
}
4、運行效果