如何在Payara中设置EJB默认并发访问超时及监控死锁?
在Payara中配置EJB默认并发访问超时及死锁排查方案
一、配置EJB默认并发访问超时
Payara支持全局设置未标注@AccessTimeout的EJB默认访问超时,有两种可行方式:
1. 通过asadmin命令设置
执行以下命令指定默认超时时间(示例为30秒,可按需调整):
set configs.config.server-config.ejb-container.descriptor-defaults.access-timeout-in-seconds=30
执行完成后重启Payara服务器,配置即可生效,超时后会自动抛出jakarta.ejb.ConcurrentAccessException。
2. 直接修改domain.xml配置
打开Payara域目录下的config/domain.xml,找到<ejb-container>节点下的<descriptor-defaults>,添加或修改access-timeout-in-seconds属性:
<ejb-container> <descriptor-defaults access-timeout-in-seconds="30"/> <!-- 其他原有配置 --> </ejb-container>
保存后重启服务器,全局默认超时设置立即生效。
二、开发环境快速识别EJB死锁
如果需要快速定位死锁问题,可通过以下几种方式:
Payara管理控制台线程分析
登录管理控制台(默认地址http://localhost:4848),进入「服务器 > 监控 > 线程池」查看阻塞线程,或通过「诊断 > 线程转储」生成完整线程快照,分析线程锁的持有与等待关系。开启EJB容器调试日志
在domain.xml中调整日志级别,开启EJB容器的调试日志:<logger name="jakarta.ejb.container" level="FINE"/>服务器日志会输出EJB锁的获取、等待等细节,帮助追踪死锁发生的上下文。
JDK工具分析线程状态
- 使用
jstack生成线程转储:
打开文件搜索jstack [Payara进程ID] > thread_dump.txtBLOCKED状态线程,结合堆栈信息判断是否存在循环等待锁的死锁场景。 - 使用
jconsole或visualvm等可视化工具连接Payara进程,实时查看线程锁的持有情况,直观定位死锁。
- 使用
内容的提问来源于stack exchange,提问作者NotGaeL
相关产品推荐
相关产品推荐

