From 62d83dfe0ab2c3cbe13abf11db4787608902f8f4 Mon Sep 17 00:00:00 2001 From: Zhujx Date: Fri, 25 Jul 2025 17:28:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=B7=A5=E5=85=B7=E7=B1=BB=E5=92=8C?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E7=9A=84=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/config/GlobalJacksonConfig.java | 21 ++++++ .../basic/config/HttpClientConfig.java | 56 ++++++++++++++ .../xiang/xservice/basic/utils/DateUtils.java | 14 ++++ .../xiang/xservice/basic/utils/HttpUtils.java | 75 +++++++++++++++++++ .../xiang/xservice/basic/utils/JsonUtils.java | 18 +++++ 5 files changed, 184 insertions(+) create mode 100644 xservice-common/src/main/java/com/xiang/xservice/basic/config/GlobalJacksonConfig.java create mode 100644 xservice-common/src/main/java/com/xiang/xservice/basic/config/HttpClientConfig.java create mode 100644 xservice-common/src/main/java/com/xiang/xservice/basic/utils/JsonUtils.java diff --git a/xservice-common/src/main/java/com/xiang/xservice/basic/config/GlobalJacksonConfig.java b/xservice-common/src/main/java/com/xiang/xservice/basic/config/GlobalJacksonConfig.java new file mode 100644 index 0000000..432784c --- /dev/null +++ b/xservice-common/src/main/java/com/xiang/xservice/basic/config/GlobalJacksonConfig.java @@ -0,0 +1,21 @@ +package com.xiang.xservice.basic.config; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @Author: xiang + * @Date: 2025-07-25 15:56 + */ +@Configuration +public class GlobalJacksonConfig { + @Bean + public ObjectMapper objectMapper() { + ObjectMapper mapper = new ObjectMapper(); + // 设置null字段也序列化 + mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); + return mapper; + } +} diff --git a/xservice-common/src/main/java/com/xiang/xservice/basic/config/HttpClientConfig.java b/xservice-common/src/main/java/com/xiang/xservice/basic/config/HttpClientConfig.java new file mode 100644 index 0000000..d079e4e --- /dev/null +++ b/xservice-common/src/main/java/com/xiang/xservice/basic/config/HttpClientConfig.java @@ -0,0 +1,56 @@ +package com.xiang.xservice.basic.config; + +import org.apache.http.client.config.RequestConfig; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import java.util.concurrent.TimeUnit; + +/** + * @Author: xiang + * @Date: 2025-07-25 16:31 + */ +@Configuration +public class HttpClientConfig { + @Bean + public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() { + // 连接池管理器 + PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); + // 整个连接池最大连接数 + connectionManager.setMaxTotal(100); + // 每个主机的最大连接数 + connectionManager.setDefaultMaxPerRoute(20); + + // 请求配置 + RequestConfig requestConfig = RequestConfig.custom() + // 建立连接的超时时间 + .setConnectTimeout(5000) + // 响应超时时间 + .setSocketTimeout(10000) + // 从连接池获取连接的超时时间 + .setConnectionRequestTimeout(1000) + .build(); + + // 创建 HttpClient + CloseableHttpClient httpClient = HttpClients.custom() + .setConnectionManager(connectionManager) + .setDefaultRequestConfig(requestConfig) + // 清理空闲连接 + .evictIdleConnections(30, TimeUnit.SECONDS) + .build(); + + // 配置给 RestTemplate 使用 + return new HttpComponentsClientHttpRequestFactory(httpClient); + } + + @Bean + public RestTemplate restTemplate(HttpComponentsClientHttpRequestFactory factory) { + return new RestTemplate(factory); + } + } + diff --git a/xservice-common/src/main/java/com/xiang/xservice/basic/utils/DateUtils.java b/xservice-common/src/main/java/com/xiang/xservice/basic/utils/DateUtils.java index c17996b..b6acd6f 100644 --- a/xservice-common/src/main/java/com/xiang/xservice/basic/utils/DateUtils.java +++ b/xservice-common/src/main/java/com/xiang/xservice/basic/utils/DateUtils.java @@ -21,9 +21,23 @@ public class DateUtils { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); return LocalDateTime.parse(dateTimeStr, formatter); } + public static LocalDateTime getTimeFromStr(String str) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return LocalDateTime.parse(str, formatter); + } public static LocalDate getDateFromStr(String date) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); return LocalDate.parse(date, formatter); } + + public static LocalDateTime getDateTimeFromStr(String dateTime) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + return LocalDateTime.parse(dateTime, formatter); + } + + public static String getDateTimeStr(LocalDateTime dateTime) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return dateTime.format(formatter); + } } diff --git a/xservice-common/src/main/java/com/xiang/xservice/basic/utils/HttpUtils.java b/xservice-common/src/main/java/com/xiang/xservice/basic/utils/HttpUtils.java index 8f3d9c5..61afede 100644 --- a/xservice-common/src/main/java/com/xiang/xservice/basic/utils/HttpUtils.java +++ b/xservice-common/src/main/java/com/xiang/xservice/basic/utils/HttpUtils.java @@ -9,12 +9,14 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.util.EntityUtils; import java.io.Closeable; import java.io.IOException; import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeUnit; /** * @Author: xiang @@ -29,6 +31,31 @@ public class HttpUtils { private static final int defaultMaxPerRoute = 500; private static final int maxTotal = 2000; + private static final RequestConfig requestConfig = RequestConfig.custom() + .setConnectTimeout(connectTimeout) + .setSocketTimeout(socketTimeOut) + .setConnectionRequestTimeout(connectionRequestTimeout) + .build(); + // 使用连接池 + private static final PoolingHttpClientConnectionManager connectionManager; + + private static final CloseableHttpClient httpClient; + + static { + connectionManager = new PoolingHttpClientConnectionManager(); + // 最大连接数 + connectionManager.setMaxTotal(maxTotal); + // 每个主机的最大连接数 + connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute); + + httpClient = HttpClients.custom() + .setConnectionManager(connectionManager) + .setDefaultRequestConfig(requestConfig) + // 清理空闲连接 + .evictIdleConnections(30, TimeUnit.SECONDS) + .build(); + } + public static String doPost(String url, Map header, String jsonParams) { RequestConfig requestConfig = RequestConfig.custom() // 设置连接超时时间 @@ -55,6 +82,54 @@ public class HttpUtils { return result; } + public static String doPostV2(String url, Map header, String jsonParams) { + CloseableHttpResponse response = null; + String result = ""; + try { + log.info("HTTP请求,请求参数===>{}", jsonParams); + HttpPost httpPost = getPost(url, header, jsonParams); + response = httpClient.execute(httpPost); + result = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + log.error("doPost异常", e); + } finally { + // 不关闭 httpClient + closeResource(response); + } + return result; + } + + public static String doGetV2(String url, Map header, Map param) { + CloseableHttpResponse response = null; + String result = ""; + try { + StringBuilder requestUrl = new StringBuilder(url); + if (MapUtils.isNotEmpty(param)) { + requestUrl.append("?"); + param.forEach((k, v) -> requestUrl.append(k).append("=").append(v).append("&")); + // 去掉最后一个 & + requestUrl.setLength(requestUrl.length() - 1); + } + + HttpGet httpGet = new HttpGet(requestUrl.toString()); + httpGet.addHeader("Content-Type", "application/json"); + if (MapUtils.isNotEmpty(header)) { + header.forEach(httpGet::setHeader); + } + + log.info("doGet请求:请求地址:{}", requestUrl); + response = httpClient.execute(httpGet); + result = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + log.error("doGet异常:", e); + } finally { + closeResource(response); + } + return result; + } + + + private static HttpPost getPost(String url, Map header, String jsonParams) { HttpPost httpPost = new HttpPost(url); httpPost.addHeader("Content-Type", "application/json"); diff --git a/xservice-common/src/main/java/com/xiang/xservice/basic/utils/JsonUtils.java b/xservice-common/src/main/java/com/xiang/xservice/basic/utils/JsonUtils.java new file mode 100644 index 0000000..213d0b7 --- /dev/null +++ b/xservice-common/src/main/java/com/xiang/xservice/basic/utils/JsonUtils.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.basic.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; + +/** + * @Author: xiang + * @Date: 2025-07-25 15:58 + */ +public class JsonUtils { + public static String toJsonString(Object obj) { + return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue); + } + + public static T parse(String json, Class clazz) { + return JSON.parseObject(json, clazz); + } +}