1. 概述
ODI11G默認(rèn)提供了WebService的調(diào)用接口,供其他各種應(yīng)用程序通過接口控制、訪問ODI自身的同步任務(wù)。
ODI11G在安裝完成,啟動(dòng)代理后,會(huì)自動(dòng)啟動(dòng)webservice的服務(wù)端口,對(duì)外提供WSDL文件服務(wù),外部應(yīng)用可以通過WSDL文件利用各種技術(shù)反向生成自身應(yīng)用程序所需要的調(diào)用代碼,本文將以Axis作為WebService容器來介紹,如何生成代碼并調(diào)用ODI接口。
2.???技術(shù)說明
2.1ODI WebService介紹
ODI在安裝過程中會(huì)默認(rèn)生成一個(gè)“代理“,代理有設(shè)置的端口號(hào),假設(shè)代理的端口為:505,那么當(dāng)代理在服務(wù)器上成功啟動(dòng)以后,會(huì)生成一個(gè)web服務(wù)對(duì)外提供ODI控制所用的WSDL文件,地址為:
http://hostname:505(端口號(hào))/oraclediagent/OdiInvoke?wsdl
2.2生成客戶端調(diào)用代碼
本文檔以Axis生成Java代碼為例進(jìn)行詳細(xì)介紹如下:
首先將附件《WebService調(diào)用ODI所需Eclipse插件》解壓縮至Eclipse的plugins目錄下,并啟動(dòng)Eclipse。
在啟動(dòng)后的Eclipse界面中,點(diǎn)擊fileànewàOther,彈出如下界面:
界面中選擇Axis2 CodeGenerator—>Next:
生成接口調(diào)用client代碼
輸入ODI的WSDL地址:
一般是localhost:505/oraclediagent/OdiInvoke?wsdl
然后根據(jù)提示生成Java代碼,可以選擇將java代碼生成至某已有項(xiàng)目,如oditest
調(diào)用代碼生成完畢之后,便可以正式開始書寫客戶端調(diào)用方法,用于調(diào)用ODI的數(shù)據(jù)同步場(chǎng)景或代理。
2.3編寫Java類,調(diào)用ODI集成場(chǎng)景
以TestOdi類為例:
public?class?TestOdi{
???????public?static?voidmain(String[] args){
??????????????try?{
?????? OdiInvokeStubodiS=new?OdiInvokeStub();
???????//OdiCredentialType,ScenarioRequestType分別是接口調(diào)用的兩個(gè)核心參數(shù)
???????//OdiStartScenRequest是接口調(diào)用的直接參數(shù)
???????OdiStartScenRequeststartScenRequest=new?OdiStartScenRequest();
?????? ScenarioRequestTypescenaroRequest=new?ScenarioRequestType();
?????? scenaroRequest.setContext(“GLOBAL”);
?????? scenaroRequest.setSynchronous(false);
?????? scenaroRequest.setLogLevel(5);
?????? scenaroRequest.setScenarioName(“PKG_SZGS_TO_SSBZ”);
?????? scenaroRequest.setScenarioVersion(“001”);
???????//設(shè)置場(chǎng)景啟動(dòng)所需要的變量
?????? VariableTypevt=new?VariableType();
?????? vt.setName(“PRO_SZGS.RW_ID”);
?????? vt.setValue(“260”);
?????? scenaroRequest.addVariables(vt);
???????//設(shè)置OdiCredentialType變量
?????? OdiCredentialTypeodiCredentialType=new?OdiCredentialType();
?????? odiCredentialType.setWorkRepository(“WORKREP”);
?????? odiCredentialType.setOdiUser(“SUPERVISOR”);
?????? odiCredentialType.setOdiPassword(“sanyuan”);
???????//為OdiStartScenRequest對(duì)象設(shè)置其兩個(gè)核心參數(shù)ScenarioRequestType及OdiCredentialType
?????? startScenRequest.setRequest(scenaroRequest);
?????? startScenRequest.setCredentials(odiCredentialType);
???????//通過OdiStartScenRequest對(duì)象啟動(dòng)ODI已經(jīng)發(fā)布到代理上的場(chǎng)景
?????? odiS.invokeStartScen(startScenRequest);
????????????? }catch(Exception e){
???????????????????? System.out.println(e);
????????????? }
?????? }
}
一、聲明主對(duì)象
在調(diào)用過程中首先需要生命調(diào)用的主對(duì)象:
OdiInvokeStub odiS=new?OdiInvokeStub();。
二、聲明核心參數(shù)(對(duì)象)
其次是調(diào)用ODI所依賴的核心參數(shù)(對(duì)象),OdiStartScenRequest,最終調(diào)用ODI場(chǎng)景時(shí),將根據(jù)OdiStartScenRequest 的內(nèi)容來啟動(dòng)具體的同步場(chǎng)景:odiS.invokeStartScen(startScenRequest);。
三、設(shè)置OdiStartScenRequest所依賴的兩大屬性(對(duì)象)
1、ScenarioRequestType
scenaroRequest.setContext(“GLOBAL”);//設(shè)置上下文,默認(rèn)為GLOBAL
scenaroRequest.setSynchronous(false);//設(shè)置同步方式,即應(yīng)用程序調(diào)用時(shí)是否等待ODI場(chǎng)景執(zhí)行完成后才執(zhí)行下一步。ODI默認(rèn)為True,建議當(dāng)同步任務(wù)所要處理的數(shù)據(jù)量較大、時(shí)間較長時(shí),將該屬性設(shè)為false。
scenaroRequest.setLogLevel(5);//設(shè)置日志級(jí)別
scenaroRequest.setScenarioName(“PKG_SZGS_TO_SSBZ”);//設(shè)置要調(diào)用的ODI場(chǎng)景的名稱
scenaroRequest.setScenarioVersion(“001”);//設(shè)置要調(diào)用的ODI場(chǎng)景的版本號(hào)
假如需要為場(chǎng)景傳遞啟動(dòng)參數(shù),那么需要以下步驟:
//設(shè)置場(chǎng)景啟動(dòng)所需要的變量
VariableTypevt=new VariableType();? //VariableType是odiinvoke.odi.com.oracle.xmlns.OdiInvokeStub.VariableType類型,是用于向ODI場(chǎng)景傳遞參數(shù)信息的載體,必須要聲明
vt.setName(“PRO_SZGS.RW_ID”);設(shè)置參數(shù)(ODI變量)的名稱,名稱必須為變量的全路徑:項(xiàng)目名.變量名 的形式
vt.setValue(“260”);//設(shè)置要向ODI變量傳遞的內(nèi)容
scenaroRequest.addVariables(vt);//將變量添加到scenaroRequest中
2、OdiCredentialType
?????? //設(shè)置OdiCredentialType變量
OdiCredentialTypeodiCredentialType=new OdiCredentialType();//聲明OdiCredentialType
odiCredentialType.setWorkRepository(“WORKREP”);//設(shè)定當(dāng)前要操作的ODI工作資料配置庫名稱
odiCredentialType.setOdiUser(“SUPERVISOR”);//設(shè)定管理員帳號(hào)(與客戶端登錄ODI的帳號(hào)相同)
odiCredentialType.setOdiPassword(“sanyuan”);//設(shè)定管理員密碼
四、執(zhí)行
//為OdiStartScenRequest對(duì)象設(shè)置其兩個(gè)核心參數(shù)ScenarioRequestType及OdiCredentialType
startScenRequest.setRequest(scenaroRequest);
startScenRequest.setCredentials(odiCredentialType);
//通過OdiStartScenRequest對(duì)象啟動(dòng)ODI已經(jīng)發(fā)布到代理上的場(chǎng)景
odiS.invokeStartScen(startScenRequest);
3.???小結(jié)
通過WebService方式調(diào)用ODI中的集成場(chǎng)景還要很多其他的方法可以使用,建議參照ODI二次開發(fā)手冊(cè)詳細(xì)了解。WebService的方式為ODI集成任務(wù)整合到業(yè)務(wù)流程提供了必要的支撐。