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
相关产品推荐
相关产品推荐

