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程序。

 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


ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
|
2月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
552 7
|
2月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
676 1
|
21天前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
22天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
21天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
42 2
|
27天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
48 2
|
27天前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
27天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
39 1
|
2月前
|
JavaScript 前端开发 UED
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
92 9
|
2月前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。

推荐镜像

更多