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;
}
}