zoukankan      html  css  js  c++  java
  • OAF_开发系列25_实现OAF中Java类型并发程式开发oracle.apps.fnd.cp.request(概念)

     20150719 Created By BaoXinjian

    一、摘要


    在是使用Form/Report/SQL等并发程式时,集中在数据的操作和处理上,但是在事物处理与系统交互有很大的局限性,没有Java程序方便,

    因此需要EBS系统中注册并运行Java并发程序,通过Java的强大功能实现EBS的功能扩展

     

    在Oracle EBS中的Java并发程序(Java Concurrent Program)是系统功能中的一个亮点,它的出现使得用户可以在ERP系统中运行自己定义的Java程序。

     

    使用Java并发程序的好处:

    当遇到如下2种情况的时候,用PLSQL程序包来完成将无比麻烦:

    (1). 将服务器上的文件通过FTP安全有效的导入到apps环境下

    (2). 使用JDBC连接一个非Oracle的数据库,并获取里面的数据,通过验证和转换导入到apps下的客制化表。对于上述假定,需要DBA建立透明网关,对于如此简单的需求将会做复杂的设置。

    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.*

     

    二、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


  • 相关阅读:
    《四世同堂》金句摘抄(一)
    Django打造在线教育平台_day_3: 搭建后台管理系统Xadmin之其他app的数据表注册
    Django打造在线教育平台_day_3: 搭建后台管理系统Xadmin
    Django打造在线教育平台_day_3: 搭建后台管理系统Django自带的admin
    Django打造在线教育平台_day_2:新建operation app 编写models
    Django打造在线教育平台_day_2:新建organization app 编写models
    Django打造在线教育平台_day_2:新建courses app 编写models
    Django打造在线教育平台_day_2:新建users app 编写models之完善
    Django打造在线教育平台_day_2:新建users app 编写models之扩展user表
    Django打造在线教育平台_day_1:开发环境与项目的搭建
  • 原文地址:https://www.cnblogs.com/eastsea/p/4641640.html
Copyright © 2011-2022 走看看