Open Liberty升级至23.0.0.11后高并发下报Could not find deployment求助
问题分析与解决方案
是否有类似问题?
是的,这个问题是Open Liberty 23.0.0.10/23.0.0.11版本中引入的并发场景下CDI上下文丢失问题,已有开发者反馈。根源在于高并发时线程复用导致CDI上下文未正确绑定到JAX-WS处理器的执行线程,调用CDI.current()时无法找到对应部署上下文,抛出IllegalStateException。
不回滚版本的解决方法
1. 改用CDI依赖注入替代CDI.current()
如果JAX-WS处理器可以被CDI管理,直接注入JsonWebToken即可避免手动获取上下文的风险。修改处理器代码如下:
import javax.inject.Inject; import javax.enterprise.context.RequestScoped; @RequestScoped public class JWTTokenForwardingHandler implements SOAPHandler<SOAPMessageContext>, ServiceContextAware { protected Map<String, Object> serviceContext; protected static final MyLogger log = My.getLoggerManager().getLogger(JWTTokenForwardingHandler.class); @Inject private JsonWebToken jwt; // 直接注入JWT实例 @Override public Set<QName> getHeaders() { return null; } @SuppressWarnings("unchecked") @Override public boolean handleMessage(final SOAPMessageContext context) { final Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (isOutbound) { try { if (jwt != null) { Map<String, List<String>> requestHeaders = (Map<String, List<String>>) context.get(MessageContext.HTTP_REQUEST_HEADERS); if (requestHeaders == null) { requestHeaders = new HashMap<>(); } // 原有JWT转发逻辑 } } catch (final Exception e) { Logger.getLogger(this.getClass().getName()).log(Level.FINE, "No JWT in CDI context, nothing to forward", e); } } return true; } // 其他方法保持不变 }
注意:需确保处理器被CDI扫描到,比如添加@RequestScoped等作用域注解,或在beans.xml中显式声明该类为CDI bean;若处理器通过XML配置注册,需确认配置方式支持CDI注入。
2. 增强异常处理,避免服务崩溃
如果暂时无法修改注入方式,可在调用CDI.current()时明确捕获IllegalStateException,优雅处理上下文丢失的情况:
@Override public boolean handleMessage(final SOAPMessageContext context) { final Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (isOutbound) { try { final JsonWebToken jwt = CDI.current().select(JsonWebToken.class).get(); if (jwt != null) { // 原有JWT转发逻辑 } } catch (IllegalStateException e) { // CDI上下文丢失,记录警告日志并跳过处理 log.log(Level.WARNING, "CDI context unavailable, skipping JWT forwarding", e); } catch (final Exception e) { Logger.getLogger(this.getClass().getName()).log(Level.FINE, "No JWT in CDI context, nothing to forward", e); } } return true; }
3. 调整Open Liberty配置
在server.xml中添加CDI上下文传播配置,增强线程间的上下文绑定:
<cdi enableThreadContextPropagation="true"/>
该配置可降低线程复用导致的上下文丢失概率。
4. 升级到修复版本
Open Liberty在23.0.0.12及后续版本中已修复此问题,优先推荐升级到最新小版本,从根源解决问题。
内容的提问来源于stack exchange,提问作者DAA
相关产品推荐
相关产品推荐

