Wildfly 13中WELD-001304错误求助:多SessionScoped上下文激活
从你描述的现象和调试信息来看,这个WELD-001304异常的核心是Weld检测到@SessionScoped存在多个活跃上下文——正常的HttpSessionContextImpl本应是唯一活跃的,但却和HttpSessionDestructionContext甚至BoundSessionContextImpl同时处于激活状态。结合你遇到的触发场景(电脑休眠唤醒后操作、Selenium测试),我整理了几个可能的原因和排查方向:
1. 会话销毁流程未正常收尾
HttpSessionDestructionContext是Weld在销毁HttpSession时临时激活的上下文,用于处理会话销毁阶段的Bean回调(比如@PreDestroy)。正常情况下,会话销毁完成后,这个临时上下文会被立即销毁。如果它没有被正确清理,就会和当前正常的HttpSessionContextImpl同时活跃,触发WELD-001304。
可能的触发场景:
- 电脑休眠唤醒后,容器可能会标记过期会话并触发销毁,但休眠导致的线程中断或资源异常,可能让销毁流程中途卡住,残留了未关闭的
HttpSessionDestructionContext。 - Selenium测试中频繁创建、销毁会话,并发场景下Weld的会话销毁逻辑可能出现竞态条件,导致临时上下文未被正确回收。
2. DeltaSpike WindowScope与Weld SessionScope的生命周期冲突
你提到异常触发在获取@SessionScoped的WindowBeanHolder实例时,而这个类是DeltaSpike WindowScope的核心依赖——WindowScope的状态正是存储在SessionScope中的。如果DeltaSpike的WindowContext生命周期和Weld的SessionContext不同步,就可能干扰Session上下文的正常激活/销毁流程:
- 比如在Session销毁时,DeltaSpike的
WindowBeanHolder未被正确释放,导致Weld无法正常清理Session上下文,残留了旧的上下文实例。 - 排查时可以先确认DeltaSpike版本和Wildfly 13的兼容性(Wildfly 13自带Weld 3.0.4,对应DeltaSpike的推荐版本通常是1.9.x或2.x,避免版本不匹配导致的生命周期管理异常);另外检查是否有自定义的Session监听器或DeltaSpike扩展,干扰了上下文的状态切换。
3. Weld上下文管理的线程安全漏洞
异常影响全局而非单线程,说明BeanManager中存储的上下文状态出现了全局异常。Weld的BeanManagerImpl理论上是线程安全的,但特定版本可能存在并发场景下的漏洞:
- Weld 3.0.4.Final是否存在多上下文同时活跃的已知bug?你可以检查该版本的官方bug记录,看是否有类似的会话上下文未正确清理的问题。
- 应用中是否有手动操作Weld上下文的代码?比如手动调用
BeanManager.activateContext()或deactivateContext(),如果这些操作未正确同步,可能导致上下文状态混乱。
4. Wildfly会话持久化/恢复的异常
电脑休眠唤醒时,Wildfly可能会对HttpSession进行持久化(比如通过Infinispan缓存)和恢复,这个过程中Weld的Session上下文可能未被正确重建:
- 旧的会话销毁上下文(
HttpSessionDestructionContext)在持久化恢复时被错误地保留,而新的正常上下文又被激活,导致多个活跃上下文共存。 - 排查时可以尝试禁用Wildfly的会话持久化配置(比如移除
web.xml中的<distributable>标签,或调整local缓存的过期策略),测试休眠唤醒后是否还会触发问题。
具体排查步骤
- 开启Weld上下文调试日志:在Wildfly的
standalone.xml或domain.xml中,添加org.jboss.weld.context的DEBUG级别日志,观察上下文的激活、销毁流程,看是否有异常的上下文未被销毁的记录。 - 跟踪Session销毁流程:自定义一个
HttpSessionListener,在sessionDestroyed方法中添加日志,同时检查DeltaSpike的WindowContext是否有对应的销毁回调逻辑,确认会话销毁时所有相关上下文都被正确清理。 - 问题出现时抓线程栈:当异常触发后,立即导出JVM的线程栈(用
jstack命令),查看哪些线程在操作Session上下文,是否有线程持有未释放的上下文引用。 - 升级依赖版本:尝试升级Weld到3.0.5.Final或更高兼容版本,或者升级DeltaSpike到与Wildfly 13匹配的最新版本,看是否能修复已知的bug。
内容的提问来源于stack exchange,提问作者99Sono

