zoukankan      html  css  js  c++  java
  • ETL第二篇 调用webservice

    前言

    这里使用ETL [Java代码] 实现

    代码中使用axis调用webservice

    在ETL提供了 Processor类中直接写业务代码, 而且是每次读取一行数据

    jar包准备

    将需要用到的jar包提前放到data-integration/libdata-integration/libswt/对应的目录下
    我这里为了方便, 将需要的包发到了data-integration/libswt/win64/

    用到的相关包: 链接: https://pan.baidu.com/s/1vpUppn-57sc9z3tFGux3uA 密码: 3phi

    代码示例

    这里提供一个简单的示例供参考

    import java.net.URL;
    
    import javax.xml.namespace.QName;
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    
    
    
    public boolean processRow(StepMetaInterface smi,StepDataInterface sdi) throws KettleException{
    
    	Object[] r = getRow(); // 获取输入, 这里获取流中的一行数据
    	
    	if (r == null) {
    		setOutputDone(); // 结束输出, 说明流中没有数据了
    		return false; 
    	}
    
    	// 获取字段, 从r中获取需要的字段
    	String pk_corp = get(Fields.In, "pk_corp").getString(r);
    
    	
    	// 因为我这里需要给WS接口发送的数据是[{"pk_corp":pk_corp},{}...]
    	JSONArray syncDatas = new JSONArray();
    	JSONObject syncData = new JSONObject();
    		
    	syncData.put("pk_corp",pk_corp);
    
    	syncDatas.add(syncData);
    
    	// 输出数组, 会输出到输出流
    	Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
    	JSONObject result = null;
    
    try {
    	// 输出日志,也是ETL提供的方法
    	logBasic("【请求数据】" + syncDatas.toString());
    	
    	// 调用ws接口
    	result = syncToNC(syncDatas.toString());
    	
    	logBasic("【结果】" + result.toString());
    
    } catch (Exception e) {
    	logError("【捕获异常】" + e.getMessage());
    
    	// 这里获取流中的字段并赋值, syncSign和errorLog是我在ETL[字段]中自定义的
    	get(Fields.Out, "syncSign").setValue( outputRow, '0' );
    	get(Fields.Out, "errorLog").setValue( outputRow, e.getMessage());	
    	
    	// 输出数据传输到下一步, 下一步接收的数据就会有我在[字段中]添加的字段
    	putRow(data.outputRowMeta, outputRow);
    	
    	return true;
    }
    
    	if( result.containsKey("code") &&  result.getInt("code") == 0) {
    		JSONArray resultDatas = result.getJSONArray("data");
    		JSONObject resultData = resultDatas.getJSONObject(0);
    
    		// 输出字段
    		get(Fields.Out, "syncSign").setValue( outputRow, '1' );
    		get(Fields.Out, "newNCPK").setValue( outputRow, resultData.getString("ncPK"));
    	} else {
    		// 输出字段
    		get(Fields.Out, "syncSign").setValue( outputRow, '2' );
    		get(Fields.Out, "errorLog").setValue( outputRow, result.getString("msg"));		
    
    	}
    	
    	putRow(data.outputRowMeta, outputRow);
    
    	return true;
    } 
    
    // 调用webservice 
    private static JSONObject syncToNC(String str) throws Exception {
    	
    		JSONObject jsonResult = null;
    		// 接口地址  ( 这里后面不加"?wsdl"
    		String endpoint = "http://localhost:8090/uapws/service/nc.ift.hs.ydrs.IAddStapplybService";		
    		// targetNamespace
    		String targetNamespace = "http://ydrs.hs.ift.nc/IAddStapplybService";
    		// 调用接口中的方法
    		String operationName = "addStapplyb";
    		String result = null;
    		String message = null;
    		
    		// 接口方法名
    		Service service = new Service();
    		Call call = (Call) service.createCall();
    		// 设置webservice地址
    		call.setTargetEndpointAddress(new URL(endpoint));
    		// 发布的方法名
    		call.setOperationName(new QName(targetNamespace, operationName));
    		// 设置参数
    		call.addParameter("string", org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
    		// 返回类型
    		call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
    		call.setEncodingStyle("utf-8");
    		call.setUseSOAPAction(true);
    		call.setSOAPActionURI(targetNamespace + operationName);
    		// 设置参数组
    		Object[] params = new Object[] { str };
    
    		// 调用接口
    		result = (String) call.invoke(params);
    		// 处理结果
    		if (result != null && ! "".equals(result)) {
    			jsonResult = JSONObject.fromObject(result);
    		}
    	
    		return jsonResult;
    }
    

    ETL中使用Java代码

    自定义字段

  • 相关阅读:
    java自定义注解教程
    java8 LocalDateTime时间格式化
    java8新特性Stream用法详解
    java将数组转换成list集合
    elestaticsearch原生写法创建mapping
    springboot-mybatis-plus生成器
    jQuery.bind() 函数详解
    CSS3 中的 rem 值与 px 之间的换算
    console.log的应用
    JQuery中$(document)是什么意思有什么作用
  • 原文地址:https://www.cnblogs.com/52liming/p/9515526.html
Copyright © 2011-2022 走看看