OAF_開發系列25_實現OAF中Java類型併發程式開發oracle.apps.fnd.cp.request(概念)

 20150719 Created By BaoXinjianhtml

1、摘要java


在是使用Form/Report/SQL等併發程式時,集中在數據的操做和處理上,可是在事物處理與系統交互有很大的侷限性,沒有Java程序方便,
數據庫

所以須要EBS系統中註冊並運行Java併發程序,經過Java的強大功能實現EBS的功能擴展安全

 

在Oracle EBS中的Java併發程序(Java Concurrent Program)是系統功能中的一個亮點,它的出現使得用戶能夠在ERP系統中運行本身定義的Java程序。服務器

 

使用Java併發程序的好處:session

當遇到以下2種狀況的時候,用PLSQL程序包來完成將無比麻煩:併發

(1). 將服務器上的文件經過FTP安全有效的導入到apps環境下oracle

(2). 使用JDBC鏈接一個非Oracle的數據庫,並獲取裏面的數據,經過驗證和轉換導入到apps下的客製化表。對於上述假定,須要DBA創建透明網關,對於如此簡單的需求將會作複雜的設置。

app

2. 程序接口
函數

(1). 全部的java併發可執行都必須實現這個接口(從這個接口繼承),

它定義了一個抽象方法public abstract void runProgram(CpContext cpcontext),其子類必須實現該方法。

public class BatchsCP implements JavaConcurrentProgram{ public static final String RCS_ID = "$Header: BatchsCP.java 115.0 2008/09/07 14:36:23 pkm ship$"; public void runProgram(CpContext cpcontext){ //……coding here } }

(2). 兩個重要的包

oracle.apps.fnd.cp.request.*

oracle.apps.fnd.utl.*

 

2、CpContext


1. LogFile LOG_FILE = CpContext.getLogFile():取得併發請求的日誌類

LOG_FILE.writeln(String msg, 1):往日誌裏面寫內容

反編譯LogFile類,能夠看到它的構造函數:

public LogFile(CpContext cpcontext){ mCtx = cpcontext; mFilePath = System.getProperty("request.logfile"); }

 

2. ParameterList parameterlist = CpContext.getParameterList():取得併發請求的參數

while(parameterlist.hasMoreElements()){ NameValueType namevaluetype = parameterlist.nextParameter(); m_hashParametersList.put(new String(namevaluetype.getName()), new String(namevaluetype.getValue())); }

經過這個while循環就能夠取出全部的併發請求參數,並將他們存到Hashtable m_hashParametersList中,後面隨時要用到併發請求參數的時候就能夠經過m_hashParametersList.get(String)方法取出參數值來

 

3. ReqDetails mReqDetails = CpContext.getReqDetails():取得併發請求細節信息

(1). mReqDetails.getRequestId():獲取RequestId信息

(2). mReqDetails.ReqGeneralInfo():取得併發請求的信息類mReqGeneralInfo,這個類提供更相信的有關併發請求的信息,以下所示:

(3). mReqDetails.getSessInfo():取得session相關信息ReqSessInfo類

EnableTrace,NlsLanguage,NlsTerritory,NlsCodeSet,NlsNumChar的setter和getter方法。

(4). mReqDetails.getUserInfo():取得用戶相關信息ReqUserInfo類

UserId,RespId,RespAppId,LoginId,SecGrpId,UserName,RespName的setter和getter方法。

(5). mReqDetails.getParaInfo():取得參數相關信息ReqParameterInfo類

定義了對參數的操做:添,刪等。

實際上這些細節是經過一條SQL從Oracle表中取出,看其getDetails(Connection connection)方法就能夠知道了。

 

4. OutFile OUT_FILE = CpContext. getOutFile():取得併發請求的日誌類

OUT_FILE.writeln(String):往標準請求輸出裏面寫內容

 

5. Locale mLocale = CpContext.getLocale():取得地點區域信息(見java.util.Locale)

 

6. ReqCompletion mReqCompletion = CpContext.getReqCompletion():取得請求結束信息ReqCompletion類

另外還有setReqDetails(ReqDetails reqdetails, int i)方法。

(1). ReqCompletion.setCompletion(int i, String s):s參數能夠寫入一些信息,設置請求結束狀態

(a) 0: NORMAL

(b) 1: WARNING

(c) 2: ERROR

(d) 3: PAUSED

(2). ReqCompletion.setPaused(String s):暫停請求

 

7. Connection mJConn = CpContext.getJDBCConnection:取得Oracle JDBC驅動鏈接

 

8. CpContext.commit(Connection connection):commit鏈接

 

9. CpContext.rollback(Connection connection):rollback鏈接

另外還有CpContext.setRollbackSegment(Connection connection)設置回滾段

 

10. AppsEnvironmentStore = CpContext.createEnvironmentStore():建立EBS環境AppsEnvironmentStore類,它定義了Oracle獲取dbc文件,創建鏈接環境的的操做

 

11. CpContext.setParameterList(String s):設置併發請求參數。格式(參數間用’冒號’分隔)以下:

params="P_IP_ADDS="+host+":P_PORT="+sport+":P_USER_NAME="+user+":P_PASSWORD="+pass+":P_START_PATH="+filename+":P_END_PATH="+path+":P_DIRECTION="+"upload"; cpcontext.setParameterList(params); TransferCP transfer=new TransferCP(); transfer.runProgram(cpcontext);

 

12. CpContext.initContext():初始化上下文,裏面定義了一些初始化變量的方法和setter方法

 

13. CpContext.initGlobal():初始化全局環境,能夠查看到裏面的代碼以下:

begin fnd_global.initialize(?,?,?,?,?,?,?,?,?,?,?,?); end; --這個跟咱們在PL/SQL裏面初始化apps環境的代碼同樣效果
begin FND_GLOBAL.APPS_INITIALIZE (USER_ID =>1110, RESP_ID=>50239, RESP_APPL_ID=>200); end;

 

14. CpContext.initConcurrent():初始化併發,查看代碼下:

begin fnd_concurrent.init_request; end; --只是調用了PL/SQL標準包,具體的細節能夠去看package fnd 

 

15.CpContext.initParameterList():初始化併發請求參數列表,查看代碼以下:

select column_seq_num num, srw_param from fnd_descr_flex_column_usages where application_id = ?  -- mReqDetails.getGeneralInfo().getProgAppId();
   and descriptive_flexfield_name = ?  -- "$SRS$." + mReqDetails.getGeneralInfo().getProgName();
   and descriptive_flex_context_code = ?  -- "Global Data Elements"
   and enabled_flag = ?  -- "Y"
   order by 1
--能夠看到能夠從表fnd_descr_flex_column_usages裏面獲取併發請求參數。

 

16. CpContext.loadProfiles():

SECURITY_GROUP_ID、

USER_ID、

USERNAME、

CONC_LOGIN_ID、

RESP_ID、

RESP_APPL_ID、

CONC_REQUEST_ID、

CONC_PROGRAM_APPLICATION_ID、

PROG_APPL_ID、

CONC_PROGRAM_ID、

PROGRAM_ID、

CONC_PROGRAM_NAME、

APPL_SHRT_NAME、

CONC_PRIORITY_REQUEST、

CONC_PARENT_REQUEST、

AFLOG_ENABLED、

AFLOG_LEVEL信息加載到併發請求的Profiles中(這些參數均可以經過mReqDetails來獲取)。

另外還有對應的CpContext.setReqProfile(String s, String s1)方法

 

17. CpContext.setSession():設置會話相關參數(語言和地區),查看代碼以下:

首先獲取環境EnvironmentStore environmentstore = getEnvStore();

而後mReqDetails.getSessInfo()的getNlsLanguage()、getNlsTerritory()比較,若是取出的值是一致的,則執行以下執行以下PL/SQL:

Begin FND_GLOBAL.set_nls_context(p_nls_language=>?,  -- environmentstore.setEnv("NLS_LANGUAGE", s);
                             p_nls_territory=>?); -- environmentstore.setEnv("NLS_TERRITORY", s1);
end;

 

18. CpContext.setUserContext():設置了用戶環境(將用戶信息添加到SessionManager)

CpContext.setNLSLocale():獲取本地信息存放到CpContext.mLocale中

CpContext.setTrace():首先判斷System.getProperty("request.enabletrace");是否爲’Y’;若是是,則運行                               

BEGIN DBMS_SESSION.SET_SQL_TRACE(TRUE); END;

來設置Trace爲啓用

 

19. CpContext.requestEnd():執行以下PL/SQL來結束請求

BEGIN FND_CONC_STAT.COLLECT; END;

 

20. CpContext.modifyOutFileInDb(String s):更新FND_CONCURRENT_REQUESTS表的OUT_FILE

UPDATE FND_CONCURRENT_REQUESTS  SET OUTFILE_NAME= ? WHERE REQUEST_ID= ?

 

21. CpContext.loadEnvironment(Connection connection):加載環境上下文,調用以下PL/SQL

select variable_name, value from fnd_concurrent_requests cr , fnd_env_context ec where  cr.controlling_manager = ec.concurrent_process_id and cr.request_id = ?

 

Thanks and Regards

參考:http://blog.csdn.net/cunxiyuan108/article/details/7677773

參考:http://blog.csdn.net/cunxiyuan108/article/details/7677758

參考:http://www.cnblogs.com/echochen/archive/2011/11/17/2253148.html

相關文章
相關標籤/搜索