WebServiceUtil

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


posted @ 2019-03-07 11:13  晚安,Jake  阅读(741)  评论(0编辑  收藏  举报