类 TenantTokenManager
java.lang.Object
cn.isliu.core.service.TenantTokenManager
飞书租户访问令牌管理器
负责管理tenant_access_token的获取、缓存、过期检测和自动刷新。
实现线程安全的token管理,避免频繁的API调用,提高系统性能。
核心功能:
- 智能缓存:缓存有效的token,避免重复获取
- 过期检测:自动检测token是否即将过期(剩余时间<30分钟)
- 自动刷新:在token即将过期时自动获取新token
- 线程安全:使用读写锁确保并发访问的安全性
- 异常处理:完善的错误处理和重试机制
- 从以下版本开始:
- 1.0
- 作者:
- FsHelper
-
构造器概要
构造器 -
方法概要
修饰符和类型方法说明void强制清空token缓存 该方法会清空当前缓存的token,强制下次调用getTenantAccessToken()时重新获取。强制刷新token(用于主动刷新场景) 该方法会忽略当前缓存状态,强制获取新的token。获取有效的租户访问令牌 该方法实现智能的token管理逻辑和完整的线程安全机制: 1.获取缓存状态信息(用于监控和调试)获取当前缓存的token信息(用于调试和监控)int获取当前持有读锁的线程数量获取租户访问令牌 直接调用飞书API获取 tenant_access_token 的最大有效期是 2 小时。boolean检查当前是否有有效的缓存tokenboolean检查是否有其他线程正在获取tokenvoid记录缓存状态日志(用于监控和调试)
-
构造器详细资料
-
TenantTokenManager
构造函数- 参数:
feishuClient- 飞书客户端实例,不能为null- 抛出:
IllegalArgumentException- 如果feishuClient为null
-
-
方法详细资料
-
getTenantAccessToken
获取租户访问令牌 直接调用飞书API获取 tenant_access_token 的最大有效期是 2 小时。 剩余有效期小于 30 分钟时,调用本接口会返回一个新的 tenant_access_token,这会同时存在两个有效的 tenant_access_token。 剩余有效期大于等于 30 分钟时,调用本接口会返回原有的 tenant_access_token。- 返回:
- 获取到的租户访问令牌字符串
- 抛出:
IOException- 如果获取令牌时发生错误
-
getCachedTenantAccessToken
获取有效的租户访问令牌 该方法实现智能的token管理逻辑和完整的线程安全机制: 1. 首先使用读锁检查缓存中的token是否有效且未即将过期 2. 如果缓存的token有效且不会很快过期,直接返回 3. 如果token无效或即将过期,使用写锁获取新token 4. 在写锁中再次检查缓存(双重检查锁定模式),避免重复获取 5. 调用飞书API获取新token并更新缓存 线程安全保证: - 使用ReentrantReadWriteLock确保并发访问安全 - 实现双重检查锁定模式避免重复token获取 - 多个线程同时请求时,只有一个线程执行token获取操作 - 其他线程等待获取完成后使用新token- 返回:
- 有效的租户访问令牌字符串
- 抛出:
FsHelperException- 当token获取失败时抛出
-
getCurrentTokenInfo
获取当前缓存的token信息(用于调试和监控)- 返回:
- 当前缓存的TokenInfo,如果缓存为空返回null
-
clearTokenCache
public void clearTokenCache()强制清空token缓存 该方法会清空当前缓存的token,强制下次调用getTenantAccessToken()时重新获取。 通常在以下情况下使用: - 检测到token无效时 - 需要强制刷新token时 - 系统重置或清理时 -
hasValidCachedToken
public boolean hasValidCachedToken()检查当前是否有有效的缓存token- 返回:
- true表示有有效的缓存token,false表示缓存为空或token已过期
-
forceRefreshToken
强制刷新token(用于主动刷新场景) 该方法会忽略当前缓存状态,强制获取新的token。 使用写锁确保与其他操作的线程安全。- 返回:
- 新获取的租户访问令牌字符串
- 抛出:
FsHelperException- 当token获取失败时抛出
-
isTokenRefreshInProgress
public boolean isTokenRefreshInProgress()检查是否有其他线程正在获取token- 返回:
- true表示有线程持有写锁(正在获取token),false表示没有
-
getReadLockCount
public int getReadLockCount()获取当前持有读锁的线程数量- 返回:
- 持有读锁的线程数量
-
getCacheStatus
获取缓存状态信息(用于监控和调试)- 返回:
- 包含缓存状态的字符串描述
-
logCacheStatus
public void logCacheStatus()记录缓存状态日志(用于监控和调试)
-