使用XFire调用WebService需注意的事项
(一):注意过滤输入和输出参数空白字符
如果出现空白字符解析不了导致调用失败,导致下面的异常:
org.codehaus.xfire.fault.XFireFault: Error writing document.. nested exception is com.ctc.wstx.exc.WstxIOException: Invalid null character in text to output
at org.codehaus.xfire.fault.XFireFault.createFault(XFireFault.java:89)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:83)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
at org.codehaus.xfire.client.Client.invoke(Client.java:336)
at org.codehaus.xfire.client.Client.invoke(Client.java:368)
String.trim()一下即可。
(二):连接时注意修改一些参数
比如:HttpClientParams.CONNECTION_MANAGER_TIMEOUT // 设置Timeout
这其实不止是这里需要,任何网络编程都需要注意此事项。当对方服务死了或网络异常,
如果不做timeout处理,按照默认的时间去处理,将会导致服务积压严重甚至被脱死。
HttpClientParams.USE_EXPECT_CONTINUE //client handshake
如果服务不需要传输大量的数据,保持长连接,还是建议关闭掉此功能,设置为false。
否则,在业务量很大的情况下,很容易将服务端和自己都搞的很慢甚至拖死。
HttpClientParams params = new HttpClientParams();
// 避免'Expect: 100-continue' handshake
params.setParameter(HttpClientParams.USE_EXPECT_CONTINUE,Boolean.FALSE);
//设置ws连接超时时间
params.setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT,1000);
client.setProperty(CommonsHttpMessageSender.HTTP_CLIENT_ParaMS,params);
//设置连接参数
HttpClientParams hcparams = new HttpClientParams();
//避免'Expect: 100-continue' handshake
hcparams.setParameter(HttpClientParams.USE_EXPECT_CONTINUE,Boolean.FALSE);
hcparams.setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT,120* 1000);//单位是毫秒
Client mclient = Client.getInstance(service);
mclient.setProperty(CommonsHttpMessageSender.HTTP_CLIENT_ParaMS,params);
public Client loadClient() throws MalformedURLException,Exception{
Client client = new Client(new URL(url));
client.setTimeout(20000);
HttpClientParams params = new HttpClientParams();
// 避免'Expect: 100-continue' handshake
params.setParameter(HttpClientParams.USE_EXPECT_CONTINUE,Boolean.FALSE);
//设置ws连接超时时间
params.setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT,20000l);
client.setProperty(CommonsHttpMessageSender.HTTP_CLIENT_ParaMS,params);
return client;
}
以上的做法在实际项目中发现行不通,现修改为:
URL _url = new URL(url);
HttpURLConnection httpconnection = (HttpURLConnection)_url.openConnection();
httpconnection.setReadTimeout(20000);//设置http连接的读超时,单位是毫秒
httpconnection.connect(); Client _client = new Client(httpconnection.getInputStream(),null); _client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT,String.valueOf( 20000 ));//设置发送的超时限制,单位是毫秒; _client.setProperty(CommonsHttpMessageSender.disABLE_KEEP_ALIVE,"true"); _client.setProperty(CommonsHttpMessageSender.disABLE_EXPECT_CONTINUE,"true");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。