【问题标题】:Keeping SAP's RFC data for consecutive calls of RFC using JCO使用 JCO 为 RFC 的连续调用保留 SAP 的 RFC 数据
【发布时间】:2015-07-10 20:46:20
【问题描述】:

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

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

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

JCO 可以做到这一点吗?

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

我可以做我所描绘的吗?

【问题讨论】:

    标签: saprfc jco


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      答案是肯定的。为了让它工作,你需要实现两个任务:

      1. ABAP 代码需要将其变量存储在 ABAP 会话内存中。 函数组的全局部分中的变量将执行此操作。或者,您也可以使用标准 ABAP 技术“EXPORT TO MEMORY/IMPORT FROM MEMORY”。
      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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2018-10-19
        • 1970-01-01
        相关资源
        最近更新 更多