{
  "ticket": "U21 (issue #58)",
  "generatedAt": "2026-10-25T23:38:55+08:00",
  "purpose": "调度执行与缓存抽象实验：fixedDelay/fixedRate、异常吞噬、单线程饥饿、两种关闭语义、缓存穿透/自调用/sync单飞/evict/null默认",
  "environment": {
    "os": "macOS-27.0.1-arm64-arm-64bit",
    "arch": "arm64",
    "java": "Liberica JDK 17.0.19+11-LTS",
    "framework": "Spring Framework 6.1.12（ThreadPoolTaskScheduler/缓存注解代理/ConcurrentMapCacheManager）"
  },
  "input": "JAVA_HOME=$(/usr/libexec/java_home -v 17) bash labs/spring-senior/run.sh schedule（scheduled/shutdown/cache）",
  "exitCode": 0,
  "results": [
    "PASS scheduled fixedDelay>=task+period and fixedRate no-overlap under single thread",
    "PASS scheduled error swallowed to ErrorHandler (executions=5, errors=3, elapsed=211ms)",
    "PASS scheduled single-thread starvation (late task delayed 2901ms)",
    "PASS schedulecache scheduled",
    "PASS shutdown waitForTasksToComplete waits for queued tasks (took=473ms, done=4)",
    "PASS shutdown without wait drops queued tasks (in-flight interrupted, done=1)",
    "PASS schedulecache shutdown",
    "PASS cache hit/self-invocation-bypass/sync-singleflight/evict/null-cached-by-default",
    "PASS schedulecache cache"
  ],
  "interpretation": [
    "fixedDelay≥任务+间隔且串行；fixedRate单线程下不重叠；周期任务过载会饿死同池其他任务（实测执行数=2/10s）",
    "异常被TaskUtils装饰的ErrorHandler捕获（executions继续，errors计数）；默认handler仅记日志",
    "waitForTasksToCompleteOnShutdown=true等待全部已提交任务（实测472ms/4任务）；false为shutdownNow语义：队列任务丢弃、执行中被中断",
    "缓存：命中1次加载；this自调用两次穿透（代理壳）；sync=true并发10线程单飞1次；evict后重新加载；ConcurrentMapCache默认缓存null（实测纠正）"
  ],
  "redGreen": [
    "周期任务过载饿死后继场景（改为场景间取消）",
    "CGLIB代理壳字段不共享（改经代理方法读计数）",
    "ConcurrentMapCache默认allowNullValues=true（原文假设被实测推翻）"
  ],
  "limits": "无集群调度（分布式锁归U39/U40）；Caffeine/Redis CacheManager归U53；JMS无broker按契约推演未运行"
}
