You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:36:43