/** * 应用rpc的方式调用 这种方式就等于远程调用, * 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。 * 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService * 【注】: 如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数 第一个参数的类型是QName对象,表示要调用的方法名; 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[]; 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。 第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。 如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名, 也就是 <wsdl:definitions>元素的targetNamespace属性值。 * */ public String webserviceAxis2(String methodName,LinkedHashMap param) { log.info("调用方法:"+methodName+",输入参数:"+JSON.toJSONString(param)); String result = ""; // 使用RPC方式调用WebService RPCServiceClient serviceClient = null; try { // axis2 服务端地址 String htWsUrl = htDomain+"OAapp/WebObjects/OAapp.woa/ws/WSClientInterface"; serviceClient = new RPCServiceClient(); // 指定调用WebService的URL EndpointReference targetEPR = new EndpointReference(htWsUrl); /*MessageContext msgContext = new MessageContext(); msgContext.setServiceContext(serviceClient.getServiceContext()); MessageContext.setCurrentMessageContext(msgContext);*/ Options options = serviceClient.getOptions(); //确定目标服务地址 options.setTo(targetEPR); //确定调用方法 options.setAction("urn:"+methodName); options.setProperty(HTTPConstants.CHUNKED, "false");// 把chunk关掉后,会自动加上Content-Length //解决高并发链接超时问题 options.setManageSession(true); options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT,true); //设置响应超时,默认5s options.setProperty(HTTPConstants.SO_TIMEOUT, TIMEOUT_MILLISECONDS); //设置连接超时,默认5s options.setProperty(HTTPConstants.CONNECTION_TIMEOUT, TIMEOUT_MILLISECONDS); //options.setTimeOutInMilliSeconds(TIMEOUT_MILLISECONDS_AXIS2); /** * 指定要调用的getPrice方法及WSDL文件的命名空间 * 如果 webservice 服务端由axis2编写 * 命名空间 不一致导致的问题 * org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0 */ QName qname = new QName("http://xml.apache.org/axis/wsdd/", methodName); // 指定传递参数值 //Object[] parameters = new Object[] { "18911215691","ROOT" }; Object[] parameters = new Object[param.size()]; // 设置参数名称,具体参照从浏览器中看到的 if(param!=null&&!param.isEmpty()){ Set set = param.entrySet(); Iterator it = set.iterator(); int i=0; while(it.hasNext()){ Entry entry = (Entry)it.next(); String key = entry.getKey().toString(); if(entry.getValue() instanceof byte[]){//把object转换成字节数组 parameters[i]=toByteArray(entry.getValue()); }else{ parameters[i]=entry.getValue(); } i++; } } // 指定方法返回值的数据类型的Class对象 Class[] returnTypes = new Class[] { String.class }; // 调用方法并输出该方法的返回值 Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes); result = (String) response[0]; log.info("webserviceAxis2 result:"+result); } catch (org.apache.axis2.AxisFault e) { log.error("第三方接口异常",e); if(e.getCause()!=null&&e.getCause().toString().toLowerCase().contains("timeout")){ throw new BusinessException("第三方服务连接超时,请稍候重试!","WB_301"); } throw new BusinessException("第三方服务异常,请稍候重试!","WB_301"); } finally { try { if(serviceClient != null){ serviceClient.cleanupTransport(); } } catch (org.apache.axis2.AxisFault e) { log.error("第三方接口异常 finally",e); if(e.getCause()!=null&&e.getCause().toString().contains("SocketTimeoutException")){ throw new BusinessException("第三方服务连接超时,请稍候重试!","WB_301"); } throw new BusinessException("第三方服务异常,请稍候重试!","WB_301"); } } return result; }
public static void main(String[] args) { try { //测试 LinkedHashMap map = new LinkedHashMap(); map.put("phone", "189000000"); map.put("parentId", "ROOT"); String result = new 类名.webserviceAxis2("getDMagazineDirList",map); } catch (Exception e) { e.printStackTrace(); } }