对于webservice,个人之前实在没有什么了解,但是所处行业,很多厂商提供出来的接口确都是webservice接口,没办法,遇到问题还是要上。之前刚来到公司,接到的需求就是需要编写一个webservice客户端,虽然之前实际没有用过webservice,但是还是被需要用到的同事耳熟目染过,脑袋中第一想到就是CXF的方式,也是网上一搜索,工具类就出来了,大致工具类代码如下:
- 引入依赖包
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.5</version>
</dependency>
- 代码实现
/**
* web-service工具类
* @param wsdlURL web-service请求地址
* @param operationName web-service操作名称
* @param params 请求参数
* @return 请求数据JSON字符串
*/
public static String invokeWs(String wsdlURL, String operationName,
Object... params) {
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
Client client = clientFactory.createClient(wsdlURL);
HTTPConduit conduit = (HTTPConduit)client.getConduit();
HTTPClientPolicy policy = new HTTPClientPolicy();
policy.setConnectionTimeout(100000);//设置超时时间
policy.setReceiveTimeout(100000);//设置超时时间
conduit.setClient(policy);
Object[] objects;
JSONObject res = new JSONObject();
try {
objects = client.invoke(operationName, params);
} catch (Exception e) { // 调用接口发生异常
res.put("ResultCode", "-1");
res.put("ResultDesc", e.getMessage());
log.error(e.getMessage(), e);
return JSONObject.toJSONString(res);
}
try {
conduit.close();
client.close();
} catch (Exception e) {
res.put("ResultCode", "-1");
res.put("ResultDesc", e.getMessage());
log.error(e.getMessage(), e);
return JSONObject.toJSONString(res);
}
return parseEsb(objects[0].toString());
}
后面项目访问量大了之后,项目出问题后,大家合力找了好久原因,最后分析出是请求第三方webservice的动态生成应该存在问题。于是自己写了两种请求方式进行压测,发现确实是webservice动态客户端调用的方式存在问题后,随后采用了静态的客户端生成方式调用。生成静态客户端的步骤如下:
1、下载soap-ui,进行安装(这里利用工具生成webservice静态调用的相关类);
2、下载 apache cxf 包,并进行解压;
3、在soap-ui配置apache cxf命令的路径,填写请求的webservice地址和导出客户端代码目录;
- 第一步:打开soap-ui,点击Tools -> Apache CXF
- 第二步:在弹出的框中,点击右下加的tools按钮,找到cxf的选项,选择刚才下载apache cxf 包解压出来的bin目录
- 第三步:在弹出框内填写webservice地址,客户端代码生成目录,勾选生成客户端请求代码后点 Generate 生成对应客户端
- 去到设置的导出目录,找到相关代码复制到自己的项目中进行webservice调用(不同的webservice生成的相关类是不一样的)