WebService如何设置基于cxf的wsdl2java生成的客户端超时

基于cxf 3.1.10版本

import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.policy.PolicyDataEngine;

@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
    SpringBus springBus = new SpringBus();
    springBus.getExtension(PolicyDataEngine.class);
    springBus.setExtension(new CustomizePolicyDataEngine(springBus), PolicyDataEngine.class);
    return springBus;
}
import org.apache.cxf.Bus;
import org.apache.cxf.message.Message;
import org.apache.cxf.policy.PolicyCalculator;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.apache.cxf.ws.policy.PolicyDataEngineImpl;

public class CustomizePolicyDataEngine extends PolicyDataEngineImpl {

    public CustomizePolicyDataEngine(Bus bus) {
        super(bus);
    }

    @Override
    public <T> T getPolicy(Message message, T confPolicy, PolicyCalculator<T> intersector) {
        T policy = super.getPolicy(message, confPolicy, intersector);
        if (policy instanceof HTTPClientPolicy) {
            ((HTTPClientPolicy) policy).setConnectionTimeout(3_000);
            ((HTTPClientPolicy) policy).setReceiveTimeout(5_000);
        }
        return policy;
    }
}

以上仅能设置实际调用接口时的超时时间,如果一开始对方的服务就没有启动,在创建客户端Service的时候还是会超时,可以在获取客户端Service时,判断下端口是否可达。

import cn.hutool.core.convert.Convert;
import cn.hutool.core.net.NetUtil;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;

private static final Object mutex = new Object();

private static TestWebService testWebService;

public static TestWebService getClientInstance(String ipPort) {
	if (null == testWebService) {
		synchronized (mutex) {
			if (null != testWebService) {
				return testWebService;
			}
			try {
				boolean isOpen = NetUtil.isOpen(new InetSocketAddress(StrUtil.split(ipPort, ":").get(0), Convert.toInt(StrUtil.split(ipPort, ":").get(1))), 3_000);
				if (!isOpen) {
					throw new RuntimeException("Web Service server is closed");
				}

				URL WSDL_LOCATION = new URL("http://" + ipPort + "/api/webservice/test?wsdl");
				TestWebServiceImplService testWebServiceImplService = new TestWebServiceImplService(WSDL_LOCATION);
				testWebService = testWebServiceImplService.getTestWebServiceImplPort();
			} catch (MalformedURLException e) {
				log.error("create TestWebService error", e);
				throw new RuntimeException("create TestWebService error");
			}
		}
	}
	return testWebService;
}

<think>好的,我需要回答用户关于如何使用DynamicClientFactory创建客户端设置超时时间的问题。首先,我要回忆CXF的相关知识,DynamicClientFactory用于动态创建客户端,不需要预生成存根。用户提到的引用[1]指出,DynamicClientFactory内部还是会生成代理类,但用户不需要手动处理。接下来,设置超时时间,通常涉及HTTPConduit的配置。引用[2]提到使用wsdl2java生成客户端设置超时的方法,但用户需要动态客户端的做法。 我需要分步骤说明如何创建客户端,然后配置超时。可能需要通过Client对象获取HTTPConduit,并设置ReceiveTimeout和ConnectionTimeout。同时,注意异常处理,比如捕获可能的MalformedURLException或处理WSDL解析失败的情况。引用[4]提到了使用CXF的依赖,所以代码示例中需要包含正确的包引入。 还需要考虑代码的正确性,比如正确获取BindingProvider和SOAPBinding。可能用户会遇到的问题,比如超时设置无效,需要检查配置是否正确应用。最后,给出一个完整的示例,并提醒用户替换WSDL地址和相关参数。同时,可能建议如果频繁调用,考虑缓存客户端实例以提高性能,如引用[1]提到的生成代理类的开销。</think>### 分步解答:使用DynamicClientFactory创建Client并设置超时时间 #### 1. 创建动态客户端 通过`DynamicClientFactory`加载WSDL并创建客户端: ```java try { DynamicClientFactory dcf = DynamicClientFactory.newInstance(); Client client = dcf.createClient("http://example.com/service?wsdl"); } catch (MalformedURLException e) { // 处理WSDL地址格式错误 e.printStackTrace(); } catch (IOException e) { // 处理WSDL加载失败 e.printStackTrace(); } ``` 注意`createClient`方法内部会动态生成代理类[^1] #### 2. 配置超时参数 通过HTTPConduit设置连接和响应超时: ```java HTTPConduit conduit = (HTTPConduit) client.getConduit(); HTTPClientPolicy policy = new HTTPClientPolicy(); // 设置连接超时(单位:毫秒) policy.setConnectionTimeout(3000); // 设置接收响应超时 policy.setReceiveTimeout(10000); conduit.setClient(policy); ``` #### 3. 完整示例代码 ```java import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.transport.http.HTTPConduit; import org.apache.cxf.transports.http.configuration.HTTPClientPolicy; public class DynamicClientDemo { public static void main(String[] args) { try { // 创建动态客户端 DynamicClientFactory dcf = DynamicClientFactory.newInstance(); Client client = dcf.createClient("http://example.com/service?wsdl"); // 配置超时策略 HTTPConduit conduit = (HTTPConduit) client.getConduit(); HTTPClientPolicy policy = new HTTPClientPolicy(); policy.setConnectionTimeout(3000); // 3秒连接超时 policy.setReceiveTimeout(10000); // 10秒响应超时 conduit.setClient(policy); // 调用服务 Object[] result = client.invoke("operationName", new Object[]{param1, param2}); } catch (Exception e) { e.printStackTrace(); } } } ``` #### 关键注意事项: 1. **依赖配置**:需包含CXF核心依赖,如引用[4]中的`cxf-spring-boot-starter-jaxws` 2. **性能优化**:建议复用Client实例,避免重复创建的开销[^1] 3. **异常处理**: - `MalformedURLException`:检查WSDL地址格式 - `IOException`:检查网络连通性 4. **超时生效验证**:可通过模拟服务端延迟测试配置效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值