实现一个用于监测 API 接口可用性的线程类,其作用是通过发送 HTTP 请求到指定的 API 接口,并监测接口的可用性。
代码中的 APIThread
类继承自 Thread
,意味着它可以在单独的线程中执行。
在 run
方法中,使用 HttpURLConnection
建立与 API 接口的连接,并发送 HTTP 请求。通过设置连接超时时间、请求方法和请求头部信息,可以根据需要自定义 API 请求的配置。
在获取到 API 接口的响应后,根据响应的 HTTP 状态码和返回的内容,判断 API 接口的可用性。如果响应的状态码为 HttpURLConnection.HTTP_OK
,表示 API 接口正常工作,根据返回的内容和预设的 returnMsg
进行比较,来确定 API 接口的返回状态。如果返回内容与预设的 returnMsg
一致,表示 API 接口返回正常,否则表示返回异常。根据判断结果,通过调用 monApiService
更新监控 API 接口的状态。
如果无法建立连接或出现其他异常情况,也会将监控 API 接口的状态更新为异常。
此线程在每次请求完成后会等待一段时间(这里是 5000 毫秒),然后再次发起请求。通过 running
变量控制线程的运行状态,当调用 stopThread
方法时,将设置 running
为 false
,从而终止线程的执行。
请注意,该代码片段中使用了一些自定义的类和接口,例如 IMonApiService
,这些类和接口在代码中没有给出具体实现。因此,要使代码正常运行,需要确保相关的类和接口已经正确实现,并且适配于你的应用程序环境
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class APIThread extends Thread{private volatile boolean running = true;private Long apiId;private String apiURL;private String method;private Integer timeout = 3000;private String header;private String returnMsg;private IMonApiService monApiService;private String status = "";private String checkStatus = "";public APIThread(Long apiId, String apiURL, String method,Integer timeout, String header,String returnMsg, IMonApiService monApiService){this.apiId = apiId;this.apiURL = apiURL;this.method = method;this.header = header;this.returnMsg = returnMsg;this.timeout = timeout;this.monApiService = monApiService;}public void stopThread() {running = false;}public void run() {while (running){try {URL url = new URL(apiURL);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(timeout);connection.setRequestMethod(method);if(StringUtils.isNotBlank(header)&&header.startsWith("token:")){connection.setRequestProperty("token", header.replace("token:",""));}else{connection.setRequestProperty("Authorization", "Bearer "+header);}// 创建一个 StringBuilder 对象,用于保存 HTTP 响应的内容StringBuilder response = new StringBuilder();// 获取 HTTP 响应输入流InputStream inputStream = connection.getInputStream();// 使用 BufferedReader 对象读取输入流中的数据,并将其添加到 StringBuilder 对象中try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {String line;while ((line = reader.readLine()) != null) {response.append(line);}}// 输出 HTTP 响应内容
// System.out.println(response.toString());String res = response.toString();int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {
// System.out.println("API is working fine");if(StringUtils.isBlank(returnMsg)||"#".equals(returnMsg)){if(!"open".equals(status)) {monApiService.updateMonApiStatus(apiId, Status.OPEN);status = "open";checkStatus = "";}}else{if(StringUtils.isNotBlank(res)&&res.equals(returnMsg)){if(!"open".equals(checkStatus)) {
// System.out.println("API return fine");monApiService.updateMonApiStatus(apiId, Status.OPEN);checkStatus = "open";status="";}}else{if(!"close".equals(checkStatus)) {
// System.out.println("API return error");monApiService.updateMonApiStatus(apiId, Status.CLOSE);checkStatus = "close";status="";}}}} else {
// System.out.println("API is not working. Response code: " + responseCode);if(!"close".equals(status)) {monApiService.updateMonApiStatus(apiId, Status.CLOSE);status = "close";checkStatus = "";}}} catch (Exception ex) {
// ex.printStackTrace();
// System.out.println("API is not working. Exception: " + ex.getMessage());if(!"close".equals(status)) {monApiService.updateMonApiStatus(apiId, Status.CLOSE);status = "close";checkStatus = "";}}try {Thread.sleep(5000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}