import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.rmi.RemoteException;import javax.xml.rpc.ServiceException;import org.codehaus.xfire.client.Client;import org.codehaus.xfire.transport.http.CommonsHttpMessageSender; public class WebServiceUtil { /** * 静态调用Webservice方法 * @param method * @param parms * @return * @throws ServiceException * @throws RemoteException * @throws Exception public static String callService(ServiceMethod method, Object[] parms) throws Exception { // throws ServiceException, RemoteException, Exception { String endPoint = StringUtils.removeEnd( method.getMethodUrl(), "?wsdl"); String methodName = method.getMethodName(); String nameSpace = method.getNamespace(); String username = method.getUserName(); String password = method.getPassword(); String returnType = method.getReturnType(); Service service = new Service(); Call call = (Call)service.createCall(); // Call call = new Call(endPoint); // 设置远程webService 端点url call.setTargetEndpointAddress(endPoint); call.setTimeout(Integer.valueOf(120000)); // 是否有普通的用户身份认证 if (StringUtils.isNotEmpty(username)) { call.setUsername(username); call.setPassword(password); } // 是否设置命名空间(nameSpace) if (StringUtils.isEmpty(nameSpace)) call.setOperationName(methodName); else { call.setOperationName(new QName(nameSpace, methodName)); } // 设置方法需要的参数——参数名,类型,输入参数 int count = 0; for (Object o : parms) { call.addParameter("arg" + count++, Constants.XSD_STRING, ParameterMode.IN); } call.setReturnType(Constants.XSD_ANYSIMPLETYPE); // 通过返回值类型判断WebService的调用方式 if (StringUtils.isNotEmpty(returnType)) { Object returnXml = call.invoke(parms); return (returnXml == null) ? null : returnXml.toString(); } call.invokeOneWay(parms); return null; } */ /*** * *@Description:获取web服务调用客户端 *@Author:ouyangbiao *@Date:2016-9-29 *@param callurl *@return *@throws Exception *@Modfiy: */ public static Client getWebServiceClient(String callurl) throws Exception { URL url = new URL(callurl); HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection(); httpConnection.setReadTimeout(30000);// 设置http连接的读超时,单位是毫秒 httpConnection.setConnectTimeout(30000); httpConnection.connect(); InputStream is = httpConnection.getInputStream(); Client client = new Client(is, null); try { client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, String.valueOf(30000));// 设置发送的超时限制,单位是毫秒; // 解决Xfire/HttpMethod 造成Socket连接池满 // 解决使用netstat -ano命令,发现服务器上有大量的CLOSE_WAIT连接,导致之后的WebService服务访问经常失败 client.setProperty(CommonsHttpMessageSender.DISABLE_KEEP_ALIVE, "true"); client.setProperty(CommonsHttpMessageSender.DISABLE_EXPECT_CONTINUE,"true"); return client; } catch (Exception e) { e.printStackTrace(); } finally { if(is != null) { is.close(); } } return null; } /*** * *@Description: 调用服务 *@Author:ouyangbiao *@Date:2016-9-29 *@param in *@param serviceCode *@param prssurl *@param opName *@return *@throws Exception *@Modfiy: */ public static String callService(String url, String opName,Object... params) throws Exception { String callurl = url; if(callurl.indexOf("?wsdl")<0){ callurl=callurl+"?wsdl"; } Client client = getWebServiceClient(callurl); Object[] result = client.invoke(opName, params); String rtn = result[0] == null ? "" : result[0].toString(); return rtn; }}