1

我想知道是否可以在 SAP 内存中打开通过 JCO 调用的 RFC,以便我可以缓存内容,这是我想到的场景:

假设一个简单的函数增加一个数字。该函数以 0 开头,所以我第一次使用导入参数 1 调用它时,它应该返回 1。

我第二次调用它时,它应该返回 2 等等。

JCO可以做到这一点吗?

如果我有函数对象并连续两次调用它总是返回 1。

我可以做我所描绘的吗?

4

2 回答 2

1

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

但是请注意,您可能需要确保在单个上下文或“业务事务”中发生一系列调用。有关示例,请参见此问题和我的答案。这些上下文是短暂的,并且允许您最初可能打算获得的内容 - 请注意,您不应该设计您的应用程序,以便它必须使这些上下文保持几分钟或几小时。

于 2015-07-10T21:52:28.867 回答
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);
}
于 2020-04-17T09:20:36.847 回答