Class ScriptRuntimeContext

java.lang.Object
com.codingapi.flow.script.runtime.ScriptRuntimeContext

public class ScriptRuntimeContext extends Object
脚本运行时上下文

线程安全设计: 1. GroovyShell 不是线程安全的,不能在多线程间共享 2. GroovyClassLoader 内部使用全局类缓存,相同脚本同时执行会导致类名冲突 3. 解决方案: - 每次执行创建独立的 GroovyClassLoader 和 GroovyShell 实例 - 使用脚本哈希值进行细粒度同步,避免相同脚本并发执行

性能考虑: - 同粒度同步只影响相同脚本的并发执行,不同脚本可以并发执行 - 创建 ClassLoader 的开销相对较小,现代JVM优化后性能影响可接受

自动清理机制: - 当锁缓存数量超过阈值时自动清理 - 可选的定时清理任务,定期清理不活跃的锁

  • Method Details

    • run

      public <T> T run(String script, Class<T> returnType, Object... args)
      运行脚本
      Type Parameters:
      T - 返回类型泛型
      Parameters:
      script - 脚本内容
      returnType - 返回类型
      args - 脚本参数
      Returns:
      脚本执行结果
    • execute

      public <T> T execute(String method, String script, Class<T> returnType, Object... args)
      执行脚本

      线程安全:使用脚本哈希值进行细粒度同步 资源管理:执行完成后确保资源被释放

      Type Parameters:
      T - 返回类型泛型
      Parameters:
      method - 要调用的方法名
      script - 脚本内容
      returnType - 返回类型
      args - 脚本参数
      Returns:
      脚本执行结果
      Throws:
      FlowExecutionException - 脚本执行失败时抛出
    • clearLockCache

      public static void clearLockCache()
      清理脚本锁缓存

      在以下情况下建议调用此方法: 1. 应用关闭时 2. 执行了大量不同的脚本后,避免内存占用过大

    • setMaxLockCacheSize

      public static void setMaxLockCacheSize(int maxSize)
      设置最大锁缓存数量

      当锁缓存数量超过此值时,将自动触发清理

      Parameters:
      maxSize - 最大锁缓存数量
    • getLockCacheSize

      public static int getLockCacheSize()
      获取当前锁缓存大小
      Returns:
      当前锁缓存大小
    • getExecutionCount

      public static int getExecutionCount()
      获取脚本执行总次数
      Returns:
      脚本执行总次数
    • enableAutoCleanup

      public static void enableAutoCleanup()
      启用自动清理

      启用后,将定期清理脚本锁缓存,避免内存占用过大

    • disableAutoCleanup

      public static void disableAutoCleanup()
      禁用自动清理

      禁用后,停止定时清理任务但仍保留阈值触发清理

    • getCleanupIntervalSeconds

      public static int getCleanupIntervalSeconds()
      获取自动清理间隔(秒)
      Returns:
      清理间隔(秒)