使用JCO保持SAP的rfc数据连续调用RFC

时间:2015-07-10 20:46:20

标签: sap rfc jco

我想知道在SAP内存中保留一个通过JCO调用的rfc是否可行,这样我就可以缓存内容了,这就是我想到的场景:

假设一个增加数字的简单函数。该函数从0开始,所以第一次用import参数1调用它时它应该返回1。

第二次我称之为它应该返回2,依此类推。

这与JCO有关吗?

如果我有函数对象并进行两次成功调用,则它总是返回1.

我可以做我想象的事吗?

2 个答案:

答案 0 :(得分:1)

围绕某个连接的稳定性设计应用程序几乎不是一个好主意(除非您正在构建稳定性监视软件)。构建您的软件以使其正常工作,无论连接关闭和重新打开的频率如何,无论在服务器端初始化和销毁​​会话的频率如何。您可能希望使用数据库保留某个状态,或者您可能需要(或想要)使用系统提供的共享内存机制。所有这些对于RFC处理本身来说都是无关紧要的。

但是,请注意,您可能需要确保在单个上下文或“业务事务”中发生一系列调用。请参阅this question和我的答案以获取示例。这些上下文是短暂的,并允许您首先想要获得的内容 - 只要知道您不应该设计您的应用程序,以便它必须将这些上下文保持活动几分钟或几小时。

答案 1 :(得分:0)

答案是肯定的。为了使其工作,您需要执行两个任务:

  1. ABAP代码需要将其变量存储在ABAP会话内存中。使用功能组全局部分中的变量即可。或者,您也可以使用标准的ABAP技术“导出到内存/从内存导入”。
  2. JCo需要在两次调用之间保留用户会话。默认情况下,JCo在每次调用后都会重置后端用户会话,这当然会破坏该用户会话内存中存储的所有数据。为了防止这种情况,您需要使用JCoContext.begin()和JCoContext.end()获得有状态的RFC连接,以使用户会话在后端保持活动状态。

示例代码:

JCoDestination dest = ...
JCoFunction func = ...
try{
   JCoContext.begin(dest);
   func.execute(dest); // Will return "1"
   func.execute(dest); // Will return "2"
}
catch (JCoException e){
   // Handle network problems, ABAP exceptions, SYSTEM_FAILUREs
}
finally{
   // Make sure to release the stateful connection, otherwise you have
   // a resource-leak in your program and on backend side!
   JCoContext.end(dest);
}