Skip to content

Commit

Permalink
feat: client 定期回收,避免oom
Browse files Browse the repository at this point in the history
  • Loading branch information
yop-wdc committed Nov 20, 2024
1 parent 4818567 commit e79d8bb
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 21 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
| 版本 | 发版日期 | 变更内容 |
| --- | ------------ | ------------------------------------------ |
| 4.4.13| 2024-11-19 | 修复sm2通知验签问题,升级jackson、tika、json-path解决安全漏洞 |
| 4.4.12| 2024-06-27 | 修复商户通知解密工具,兼容跨环境调用 |
| 4.4.11| 2024-06-17 | 默认5min内2笔故障熔断,熔断时长30min,连接超时3s |
| 4.4.10| 2024-04-22 | yos文件上传支持自定义文件名 |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -378,4 +378,13 @@ private List<CertTypeEnum> checkAvailableCerts(String appKey, String provider, S
public void shutdown() {
client.shutdown();
}

@Override
protected void finalize() throws Throwable {
try {
this.shutdown();
} finally {
super.finalize();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
*/
package com.yeepay.yop.sdk.utils;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.collect.Maps;
import com.yeepay.yop.sdk.auth.credentials.provider.YopCredentialsProvider;
import com.yeepay.yop.sdk.auth.credentials.provider.YopCredentialsProviderRegistry;
Expand All @@ -14,11 +16,8 @@
import com.yeepay.yop.sdk.config.provider.YopSdkConfigProvider;
import com.yeepay.yop.sdk.service.common.YopClient;
import com.yeepay.yop.sdk.service.common.YopClientBuilder;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

Expand All @@ -45,14 +44,14 @@ public class ClientUtils {
// 当前线程上下文中的clientId
private static ThreadLocal<String> CURRENT_CLIENT_ID = new ThreadLocal<>();

// 各个环境的不同配置的基础Client列表<{provider}####{env}, List<{clientId}>>
private static final Map<String, List<String>> INNER_BASIC_CLIENT_MAP = Maps.newConcurrentMap();
// 各个环境的默认基础Client<{provider}####{env}, {clientId}>,每个环境1个
private static final Map<String, String> INNER_BASIC_CLIENT_MAP = Maps.newConcurrentMap();

// 各个环境的不同配置的Client实例<{clientId}, {ClientInst}>
private static final Map<String, Object> CLIENT_INST_MAP = Maps.newConcurrentMap();
// 各个环境的不同配置的Client实例<{clientId}, {ClientInst}>,所有环境不超过3000,默认LRU丢弃策略
private static Cache<String, Object> CLIENT_INST_CACHE = CacheBuilder.newBuilder().maximumSize(3000).build();

// 各个环境的不同Client的配置<{clientId}, {ClientParams}>
private static final Map<String, ClientParams> CLIENT_CONFIG_MAP = Maps.newConcurrentMap();
// 各个环境的不同Client的配置<{clientId}, {ClientParams}>,所有环境不超过3000, 默认LRU丢弃策略
private static final Cache<String, ClientParams> CLIENT_CONFIG_CACHE = CacheBuilder.newBuilder().maximumSize(3000).build();

/**
* 根据client配置获取client实例
Expand All @@ -63,11 +62,11 @@ public class ClientUtils {
*/
public static <ClientInst> ClientInst getOrBuildClientInst(ClientParams clientParams, ClientInstBuilder<ClientInst> instBuilder) {
final ClientInst clientInst = instBuilder.build(clientParams);
CLIENT_INST_MAP.put(clientParams.getClientId(), clientInst);
CLIENT_INST_CACHE.put(clientParams.getClientId(), clientInst);

if (!isInnerBasicClient(clientParams.getClientId())) {
final String innerBasicClientId = toInnerBasicClientId(clientParams.getClientId());
CLIENT_INST_MAP.put(innerBasicClientId, YopClientBuilder.builder()
CLIENT_INST_CACHE.put(innerBasicClientId, YopClientBuilder.builder()
.withInner(true)
.withClientId(innerBasicClientId)
.withProvider(clientParams.getProvider())
Expand All @@ -87,7 +86,7 @@ public static <ClientInst> ClientInst getOrBuildClientInst(ClientParams clientPa
}

public static <ClientInst> ClientInst getClientInst(String clientId) {
return (ClientInst) CLIENT_INST_MAP.get(clientId);
return (ClientInst) CLIENT_INST_CACHE.getIfPresent(clientId);
}

public static boolean isBasicClient(String clientId) {
Expand All @@ -111,10 +110,9 @@ public static String computeClientIdSuffix(ClientParams clientParams) {
}

public static void cacheClientConfig(String clientId, ClientParams clientParams) {
CLIENT_CONFIG_MAP.put(clientId, clientParams);
CLIENT_CONFIG_CACHE.put(clientId, clientParams);
if (isInnerBasicClient(clientId)) {
INNER_BASIC_CLIENT_MAP.computeIfAbsent(getClientEnvCacheKey(clientParams.getProvider(), clientParams.getEnv()),
p -> new LinkedList<>()).add(clientId);
INNER_BASIC_CLIENT_MAP.put(getClientEnvCacheKey(clientParams.getProvider(), clientParams.getEnv()), clientId);
}
}

Expand Down Expand Up @@ -146,9 +144,9 @@ public static YopClient getAvailableYopClient(String provider, String env) {
}
if (null == clientInst) {
final String clientEnvCacheKey = getClientEnvCacheKey(provider, env);
final List<String> clientIds = INNER_BASIC_CLIENT_MAP.get(clientEnvCacheKey);
if (CollectionUtils.isNotEmpty(clientIds)) {
clientInst = getClientInst(clientIds.get(0));
String clientId = INNER_BASIC_CLIENT_MAP.get(clientEnvCacheKey);
if (StringUtils.isNotBlank(clientId)) {
clientInst = getClientInst(clientId);
}
}
if (null == clientInst) {
Expand All @@ -168,7 +166,7 @@ public static void removeCurrentClientId() {
public static YopSdkConfigProvider getCurrentSdkConfigProvider() {
final String currentClientId = getCurrentClientId();
if (StringUtils.isNotBlank(currentClientId)) {
final ClientParams clientParams = CLIENT_CONFIG_MAP.get(currentClientId);
final ClientParams clientParams = CLIENT_CONFIG_CACHE.getIfPresent(currentClientId);
if (null != clientParams && null != clientParams.getYopSdkConfigProvider()) {
return clientParams.getYopSdkConfigProvider();
}
Expand All @@ -179,7 +177,7 @@ public static YopSdkConfigProvider getCurrentSdkConfigProvider() {
public static YopCredentialsProvider getCurrentCredentialsProvider() {
final String currentClientId = getCurrentClientId();
if (StringUtils.isNotBlank(currentClientId)) {
final ClientParams clientParams = CLIENT_CONFIG_MAP.get(currentClientId);
final ClientParams clientParams = CLIENT_CONFIG_CACHE.getIfPresent(currentClientId);
if (null != clientParams && null != clientParams.getCredentialsProvider()) {
return clientParams.getCredentialsProvider();
}
Expand All @@ -190,7 +188,7 @@ public static YopCredentialsProvider getCurrentCredentialsProvider() {
public static YopPlatformCredentialsProvider getCurrentPlatformCredentialsProvider() {
final String currentClientId = getCurrentClientId();
if (StringUtils.isNotBlank(currentClientId)) {
final ClientParams clientParams = CLIENT_CONFIG_MAP.get(currentClientId);
final ClientParams clientParams = CLIENT_CONFIG_CACHE.getIfPresent(currentClientId);
if (null != clientParams && null != clientParams.getPlatformCredentialsProvider()) {
return clientParams.getPlatformCredentialsProvider();
}
Expand Down

0 comments on commit e79d8bb

Please sign in to comment.