1
0
mirror of synced 2026-10-17 04:46:10 +08:00

🎨 #3934【企业微信】修复会话存档 SDK 每次 API 调用后被销毁并重新初始化的问题

This commit is contained in:
Copilot
2026-06-06 20:31:06 +08:00
committed by GitHub
parent 45d529c062
commit fab98621c0
7 changed files with 260 additions and 24 deletions

View File

@@ -392,10 +392,11 @@ public interface WxCpConfigStorage {
/**
* 减少会话存档SDK的引用计数
* 当引用计数降为0时,自动销毁SDK以释放资源
* 当引用计数降为0且SDK已过期时,才自动销毁SDK以释放资源
* 如果SDK尚未过期,保留SDK缓存以供后续调用复用
*
* @param sdk sdk id
* @return 减少后的引用计数,如果返回0表示SDK已被销毁,如果SDK不匹配返回-1
* @return 减少后的引用计数;SDK不匹配或引用计数已为0时返回-1
* @deprecated 引用计数机制已废弃,由 ThreadLocal 模式替代。
*/
@Deprecated
@@ -424,7 +425,8 @@ public interface WxCpConfigStorage {
/**
* 减少SDK引用计数并在必要时释放(原子操作)
* 此方法确保引用计数递减和SDK检查在同一个同步块内完成
* 当引用计数降为0且SDK已过期时,才销毁SDK以释放资源
* 如果SDK尚未过期,保留SDK缓存以供后续调用复用,避免频繁初始化和销毁
*
* @param sdk sdk id
* @deprecated 引用计数机制已废弃,由 ThreadLocal 模式替代。

View File

@@ -609,9 +609,9 @@ public class WxCpDefaultConfigImpl implements WxCpConfigStorage, Serializable {
public synchronized int decrementMsgAuditSdkRefCount(long sdk) {
if (this.msgAuditSdk == sdk && this.msgAuditSdkRefCount > 0) {
int newCount = --this.msgAuditSdkRefCount;
// 当引用计数降为0时,自动销毁SDK以释放资源
// 再次检查SDK是否仍然是当前缓存的SDK(防止并发重新初始化)
if (newCount == 0 && this.msgAuditSdk == sdk) {
// 当引用计数降为0且SDK已过期时,才销毁SDK以释放资源
// 如果SDK尚未过期,保留SDK缓存以供后续调用复用,避免频繁初始化和销毁
if (newCount == 0 && this.msgAuditSdk == sdk && isMsgAuditSdkExpired()) {
Finance.DestroySdk(sdk);
this.msgAuditSdk = 0;
this.msgAuditSdkExpiresTime = 0;
@@ -646,9 +646,9 @@ public class WxCpDefaultConfigImpl implements WxCpConfigStorage, Serializable {
public synchronized void releaseMsgAuditSdk(long sdk) {
if (this.msgAuditSdk == sdk && this.msgAuditSdkRefCount > 0) {
int newCount = --this.msgAuditSdkRefCount;
// 当引用计数降为0时,自动销毁SDK以释放资源
// 再次检查SDK是否仍然是当前缓存的SDK(防止并发重新初始化)
if (newCount == 0 && this.msgAuditSdk == sdk) {
// 当引用计数降为0且SDK已过期时,才销毁SDK以释放资源
// 如果SDK尚未过期,保留SDK缓存以供后续调用复用,避免频繁初始化和销毁
if (newCount == 0 && this.msgAuditSdk == sdk && isMsgAuditSdkExpired()) {
Finance.DestroySdk(sdk);
this.msgAuditSdk = 0;
this.msgAuditSdkExpiresTime = 0;

View File

@@ -589,9 +589,9 @@ public class WxCpRedisConfigImpl implements WxCpConfigStorage {
public synchronized int decrementMsgAuditSdkRefCount(long sdk) {
if (this.msgAuditSdk == sdk && this.msgAuditSdkRefCount > 0) {
int newCount = --this.msgAuditSdkRefCount;
// 当引用计数降为0时,自动销毁SDK以释放资源
// 再次检查SDK是否仍然是当前缓存的SDK(防止并发重新初始化)
if (newCount == 0 && this.msgAuditSdk == sdk) {
// 当引用计数降为0且SDK已过期时,才销毁SDK以释放资源
// 如果SDK尚未过期,保留SDK缓存以供后续调用复用,避免频繁初始化和销毁
if (newCount == 0 && this.msgAuditSdk == sdk && isMsgAuditSdkExpired()) {
Finance.DestroySdk(sdk);
this.msgAuditSdk = 0;
this.msgAuditSdkExpiresTime = 0;
@@ -623,9 +623,9 @@ public class WxCpRedisConfigImpl implements WxCpConfigStorage {
public synchronized void releaseMsgAuditSdk(long sdk) {
if (this.msgAuditSdk == sdk && this.msgAuditSdkRefCount > 0) {
int newCount = --this.msgAuditSdkRefCount;
// 当引用计数降为0时,自动销毁SDK以释放资源
// 再次检查SDK是否仍然是当前缓存的SDK(防止并发重新初始化)
if (newCount == 0 && this.msgAuditSdk == sdk) {
// 当引用计数降为0且SDK已过期时,才销毁SDK以释放资源
// 如果SDK尚未过期,保留SDK缓存以供后续调用复用,避免频繁初始化和销毁
if (newCount == 0 && this.msgAuditSdk == sdk && isMsgAuditSdkExpired()) {
Finance.DestroySdk(sdk);
this.msgAuditSdk = 0;
this.msgAuditSdkExpiresTime = 0;