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代碼

自定義字段


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM