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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:05:56