如何在Jakarta EE 9.1 CDI对话作用域(MyFaces 3.0)中缩短超时时间?
解决JSF 3.0 + TomEE中Conversation Scope超时不生效的问题
问题分析
你在使用JSF 3.0搭配TomEE时,尝试通过conversation.setTimeout()或OpenWebBeans配置文件修改对话超时时间,虽然conversation.getTimeout()返回值显示配置成功,但对话实际仍会在默认30分钟后过期。核心原因是配置项未被正确识别,或是TomEE层面的默认配置覆盖了自定义设置。
可行解决方案
1. 修正OpenWebBeans配置项
你之前使用的org.apache.webbeans.conversation.Conversation.timeoutInterval并非正确的配置键,TomEE中OpenWebBeans控制对话超时的有效配置项是org.apache.webbeans.conversation.timeout,单位为毫秒。
修改META-INF/openwebbeans/openwebbeans.properties内容:
configuration.ordinal=101 # 10分钟 = 600000毫秒 org.apache.webbeans.conversation.timeout=600000
2. 全局配置TomEE(tomee.xml)
如果项目级配置不生效,可在TomEE的conf/tomee.xml中添加全局配置,确保覆盖默认值:
<Container id="myCdiContainer" type="Cdi"> <Property name="conversationTimeout">600000</Property> </Container>
该配置会应用到所有部署在TomEE上的CDI应用。
3. 代码层面优化超时设置时机
确保在对话启动后立即设置超时,同时注意setTimeout()的单位是毫秒(10分钟对应600000,你测试用的10000是10秒,易混淆):
public void begin() { if (!conversation.isTransient()) { conversation.end(); } conversation.begin(); // 设置10分钟超时 conversation.setTimeout(600000); System.out.println("当前对话超时时间:" + conversation.getTimeout() + "毫秒"); }
4. 正确验证对话超时
对话超时是从最后一次请求对话的时间开始计算,而非对话创建时间。测试步骤:
- 点击Begin启动对话
- 修改输入框内容并触发请求(刷新对话活跃时间)
- 等待10分钟后再次触发请求,观察Bean是否被销毁
额外注意事项
- 确保
openwebbeans.properties放置在META-INF/openwebbeans/目录下,TomEE会自动加载该路径的配置 - 若使用TomEE 8+版本,CDI规范与OpenWebBeans版本有变动,优先使用全局
tomee.xml配置更稳妥
内容的提问来源于stack exchange,提问作者fernando cesar de lima
相关产品推荐
相关产品推荐

