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来命名(CP:Concurrent 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类
EnableTrace,NlsLanguage,NlsTerritory,NlsCodeSet,NlsNumChar的setter和getter方法。
mReqDetails.getUserInfo():取得用户相关信息ReqUserInfo类
UserId,RespId,RespAppId,LoginId,SecGrpId,UserName,RespName的setter和getter方法。
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)方法。
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_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 = ?
3、 Oracle JDBC访问数据库
oracle.jdbc.driver.OracleConnection:Oracle JDBC连接数据库类
通过上面的CpContext可以很容易的取到Oracle JDBC连接。
(OracleConnection)cpcontext.getJDBCConnection(this, cpcontext.getSessionId())
oracle.jdbc.driver.OracleCallableStatement:Oracle JDBC执行PL/SQL类
(OracleCallableStatement)conn.prepareCall(String strPLSQL);
OracleCallableStatement.execute();之后就可以执行PL/SQL代码
java.sql.PreparedStatement:
(PreparedStatement)conn.prepareStatement(String strSq.);
PreparedStatement.executeQuery();执行查询
PreparedStatement.executeUpdate();执行insert、update、delete等操作时用。
4、 另外介绍一个类:ConcurrentRequest
该类有几个重要的方法,下面依次介绍
(1)、构造方法ConcurrentRequest(Connection connection)
该类的构造函数需要传入Connection,Connection对象是连接数据库的所必须的。
(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 |