类 TenantTokenManager

java.lang.Object
cn.isliu.core.service.TenantTokenManager

public class TenantTokenManager extends Object
飞书租户访问令牌管理器 负责管理tenant_access_token的获取、缓存、过期检测和自动刷新。 实现线程安全的token管理,避免频繁的API调用,提高系统性能。 核心功能: - 智能缓存:缓存有效的token,避免重复获取 - 过期检测:自动检测token是否即将过期(剩余时间<30分钟) - 自动刷新:在token即将过期时自动获取新token - 线程安全:使用读写锁确保并发访问的安全性 - 异常处理:完善的错误处理和重试机制
从以下版本开始:
1.0
作者:
FsHelper
  • 构造器详细资料

    • TenantTokenManager

      public TenantTokenManager(FeishuClient feishuClient)
      构造函数
      参数:
      feishuClient - 飞书客户端实例,不能为null
      抛出:
      IllegalArgumentException - 如果feishuClient为null
  • 方法详细资料

    • getTenantAccessToken

      public String getTenantAccessToken() throws IOException
      获取租户访问令牌 直接调用飞书API获取 tenant_access_token 的最大有效期是 2 小时。 剩余有效期小于 30 分钟时,调用本接口会返回一个新的 tenant_access_token,这会同时存在两个有效的 tenant_access_token。 剩余有效期大于等于 30 分钟时,调用本接口会返回原有的 tenant_access_token。
      返回:
      获取到的租户访问令牌字符串
      抛出:
      IOException - 如果获取令牌时发生错误
    • getCachedTenantAccessToken

      public String getCachedTenantAccessToken() throws FsHelperException
      获取有效的租户访问令牌 该方法实现智能的token管理逻辑和完整的线程安全机制: 1. 首先使用读锁检查缓存中的token是否有效且未即将过期 2. 如果缓存的token有效且不会很快过期,直接返回 3. 如果token无效或即将过期,使用写锁获取新token 4. 在写锁中再次检查缓存(双重检查锁定模式),避免重复获取 5. 调用飞书API获取新token并更新缓存 线程安全保证: - 使用ReentrantReadWriteLock确保并发访问安全 - 实现双重检查锁定模式避免重复token获取 - 多个线程同时请求时,只有一个线程执行token获取操作 - 其他线程等待获取完成后使用新token
      返回:
      有效的租户访问令牌字符串
      抛出:
      FsHelperException - 当token获取失败时抛出
    • getCurrentTokenInfo

      public TokenInfo getCurrentTokenInfo()
      获取当前缓存的token信息(用于调试和监控)
      返回:
      当前缓存的TokenInfo,如果缓存为空返回null
    • clearTokenCache

      public void clearTokenCache()
      强制清空token缓存 该方法会清空当前缓存的token,强制下次调用getTenantAccessToken()时重新获取。 通常在以下情况下使用: - 检测到token无效时 - 需要强制刷新token时 - 系统重置或清理时
    • hasValidCachedToken

      public boolean hasValidCachedToken()
      检查当前是否有有效的缓存token
      返回:
      true表示有有效的缓存token,false表示缓存为空或token已过期
    • forceRefreshToken

      public String forceRefreshToken() throws FsHelperException
      强制刷新token(用于主动刷新场景) 该方法会忽略当前缓存状态,强制获取新的token。 使用写锁确保与其他操作的线程安全。
      返回:
      新获取的租户访问令牌字符串
      抛出:
      FsHelperException - 当token获取失败时抛出
    • isTokenRefreshInProgress

      public boolean isTokenRefreshInProgress()
      检查是否有其他线程正在获取token
      返回:
      true表示有线程持有写锁(正在获取token),false表示没有
    • getReadLockCount

      public int getReadLockCount()
      获取当前持有读锁的线程数量
      返回:
      持有读锁的线程数量
    • getCacheStatus

      public String getCacheStatus()
      获取缓存状态信息(用于监控和调试)
      返回:
      包含缓存状态的字符串描述
    • logCacheStatus

      public void logCacheStatus()
      记录缓存状态日志(用于监控和调试)