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

WebLogic 12c部署JAX-WS RI SOAP客户端超时重复请求问题咨询

解决WebLogic 12c上JAX-WS RI SOAP客户端超时重复请求的问题

嘿,我之前也碰到过类似的坑——WebLogic 12c自带的JAX-WS实现默认就开了超时重试逻辑,再加上你用异步任务的方式调用,很容易就触发重复请求。咱们一步步来捋清楚解决方案:

1. 先关掉WebLogic的内置重试机制

这是最核心的一步,WebLogic对同步、异步的JAX-WS请求都默认启用了重试,你可以通过两种方式禁用:

  • 全局系统参数:在WebLogic启动脚本里添加这两个参数,一劳永逸:
    -Dweblogic.wsee.jaxws.client.disable.async.retry=true
    -Dweblogic.wsee.jaxws.client.disable.sync.retry=true
    
  • 代码层面按需配置:如果不想修改全局设置,就在获取Port实例后,手动修改请求上下文:
    MerchantWebServiceSoap serviceSoap = ...; // 你的Port实例
    Map<String, Object> requestContext = ((BindingProvider) serviceSoap).getRequestContext();
    // 禁用WebLogic的重试逻辑
    requestContext.put("weblogic.wsee.disable.retry", Boolean.TRUE);
    

2. 完善你的异步任务超时处理

从你给出的代码片段看,你用了ExecutorService和Future来异步调用服务。这里要注意两个细节:

  • 检查你的AuthZTask内部有没有自己写重试逻辑——比如超时后又重新发起请求,那肯定会导致重复调用。
  • 超时后一定要主动取消Future任务,避免任务在后台继续执行,导致后续又发一次请求:
    try {
        // 用你传入的time作为超时时间,记得指定时间单位
        response = future.get(time, TimeUnit.MILLISECONDS);
    } catch (TimeoutException e) {
        // 取消任务,中断正在执行的请求
        future.cancel(true);
        // 这里可以抛业务异常或者做自定义超时处理
        throw new RuntimeException("请求超时,已取消任务", e);
    } finally {
        // 记得关闭线程池,避免资源泄漏
        executor.shutdown();
    }
    

3. 确认JAX-WS RI的配置

如果你是手动引入的JAX-WS RI(而非WebLogic自带的实现),还要确保客户端的超时参数设置正确,并且没开启RI自带的重试:

// 设置连接和读取超时
requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, time);
requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, time);
// 禁用JAX-WS RI自带的重试(如果有开启的话)
requestContext.put("com.sun.xml.ws.retry.enabled", false);

4. 排查WebLogic的HTTP客户端配置

有时候WebLogic的HTTP连接池配置也会触发重试,你可以进WebLogic控制台检查:

  • 找到你的服务器实例 → 配置 → 协议 → HTTP,把“重试次数”改成0,避免HTTP层面的重试。

总结一下:大概率是WebLogic默认的JAX-WS重试机制在搞鬼,先把这个关掉,再把异步任务的超时处理逻辑补全,基本就能解决重复请求的问题了。

内容的提问来源于stack exchange,提问作者ram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:18:18