现在的位置: 首页 > 综合 > 正文

Oracle.apps.fnd.cp.request包常用java类分析

2013年11月02日 ⁄ 综合 ⁄ 共 6884字 ⁄ 字号 评论关闭

Oracle.apps.fnd.cp.request包常用java类分析

1、 JavaConcurrentProgram接口:

package oracle.apps.fnd.cp.request;

public interface JavaConcurrentProgram

{

    public abstract void runProgram(CpContext cpcontext);

    public static final String RCS_ID = "$Header: JavaConcurrentProgram.java 115.0 2000/06/16 18:02:39 pkm ship     $";

}

所有的java并发可执行都必须实现这个接口(从这个接口继承),它定义了一个抽象方法public abstract void
runProgram(CpContext cpcontext)
,其子类必须实现该方法。

如自己定义了一个java并发可执行xxx,则该类名最好使用xxxCP来命名(CPConcurrent
Program)

例如:

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、 CpContext类:

我做了一个简单的跟踪,找到了底层类(想跟踪底层代码的可以按照这条线往下追踪):

CLASS

实现的INTERFACE

Context

Cloneable

--AppsContext

Cloneable

    --CpContext

下面对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");

}

里面用到了System,不知道是哪个类,看到它的getProperty(String)方法,好像可以取些配置信息

(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()取得并发请求细节信息

mReqDetails.getRequestId()

ReqGeneralInfo mReqGeneralInfo = mReqDetails.ReqGeneralInfo():取得并发请求的信息类mReqGeneralInfo,这个类提供更相信的有关并发请求的信息,如下所示:

mReqDetails.getSessInfo():取得session相关信息ReqSessInfo

EnableTraceNlsLanguageNlsTerritoryNlsCodeSetNlsNumCharsettergetter方法。

mReqDetails.getUserInfo():取得用户相关信息ReqUserInfo

UserIdRespIdRespAppIdLoginIdSecGrpIdUserNameRespNamesettergetter方法。

mReqDetails.getParaInfo():取得参数相关信息ReqParameterInfo

定义了对参数的操作:添,删等。

实际上这些细节是通过一条SQLOracle表中取出,看其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)方法。

ReqCompletion.setCompletion(int i, String s)s参数可以写入一些信息,设置请求结束状态

i

请求结束状态

0

NORMAL

1

WARNING

2

ERROR

3

PAUSED

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_concurrent.init_request

(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_IDUSER_IDUSERNAMECONC_LOGIN_IDRESP_IDRESP_APPL_IDCONC_REQUEST_IDCONC_PROGRAM_APPLICATION_IDPROG_APPL_IDCONC_PROGRAM_IDPROGRAM_IDCONC_PROGRAM_NAMEAPPL_SHRT_NAMECONC_PRIORITY_REQUESTCONC_PARENT_REQUESTAFLOG_ENABLEDAFLOG_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 = ?

3、 Oracle JDBC访问数据库

oracle.jdbc.driver.OracleConnectionOracle JDBC连接数据库类

通过上面的CpContext可以很容易的取到Oracle JDBC连接。

(OracleConnection)cpcontext.getJDBCConnection(this, cpcontext.getSessionId())

oracle.jdbc.driver.OracleCallableStatementOracle JDBC执行PL/SQL

(OracleCallableStatement)conn.prepareCall(String strPLSQL);

OracleCallableStatement.execute();之后就可以执行PL/SQL代码

java.sql.PreparedStatement

(PreparedStatement)conn.prepareStatement(String strSq.);

PreparedStatement.executeQuery();执行查询

PreparedStatement.executeUpdate();执行insertupdatedelete等操作时用。

4、 另外介绍一个类:ConcurrentRequest

该类有几个重要的方法,下面依次介绍

(1)、构造方法ConcurrentRequest(Connection connection)

该类的构造函数需要传入ConnectionConnection对象是连接数据库的所必须的。

(2)、提交并发请求的函数:submitRequest(String s, String s1, String s2, String s3, boolean flag, Vector vector)

可以看到其实质是用plsql提交了并发请求fnd_request.submit_request

前面5个参数就对应fnd_request.submit_request的前5个参数,从第六个开始就是从集合vector中取(并发请求参

(3)、其他一些与并发请求有关的方法与后台执行plsql的对应

ConcurrentRequest类的方法

PLSQL的包的方法

submitRequest

fnd_request.submit_request

addNotification

fnd_request.add_notification

addLayout

fnd_request.add_layout

addPrinter

fnd_request.add_printer

setPrintOptions

fnd_request.set_print_options

setReleaseClass

fnd_request.set_rel_class_options

setRepeatOptions

fnd_request.set_repeat_options

setSpecificSchedule

fnd_conc_release_class_utils.assign_specific_sch

setRequestOptions

fnd_request.set_options

retrivePLSQLError

FND_MESSAGE.GET

setDeferred

fnd_request.set_deferred

setDeferredRequest

fnd_request.set_def_request_id

抱歉!评论已关闭.