【问题标题】:When using SAP JCO (v3.0), how do I handle an exception during JCoContext.end()?使用 SAP JCO (v3.0) 时,如何在 JCoContext.end() 期间处理异常?
【发布时间】:2016-01-19 14:35:59
【问题描述】:

全部,

我们目前开发了一个通过 JCO v3.0 API 与 SAP 通信的 Java 客户端应用程序。在调用多个 BAPI 函数的有状态调用期间,我们使用 JCoContext 类来建立有状态会话。我们在执行 JCoFunction 之前调用 JCoContext.begin(),并在所有函数完成后在 finally 块中调用 JCoContext.end()。

问题出现在 JCoContext.end() 上。它可能会引发 JCoException。文档不是很清楚为什么会发生异常或如何处理它。在测试中,当将 NULL 目标传递给 JCoContext.end() 方法时,我已经能够观察到异常。虽然这可能发生,但它绝对不会出现在我们的生产代码中。那么问题来了,是否还有其他原因会引发异常?

此外,如果未调用 JCoContext.end() 方法,我观察到了奇怪的行为。在这些情况下,我看到后续 BAPI 调用未成功完成。这向我表明,如果 end() 方法没有成功完成,它可能会使 JCo 处于错误状态。那么,我们应该如何处理这里发生的异常。作为开发人员,我有什么追索权?看来我唯一的保证就是关闭程序。

如果您有任何想法,请告诉我,谢谢,

保罗·曼宁

【问题讨论】:

    标签: java exception-handling sap jco


    【解决方案1】:

    SAP 员工在 SCN 论坛上回答了这个问题。我在那里交叉发布了这个问题。这是链接:

    SAP Forum Question: SAP JCo: How to handle an Exception thrown by JCoContext.end()

    总而言之,JCoContext.end() 方法应该只在传入的“destination”参数为 NULL 或 SAP JCO 中存在错误时引发异常。因此,您必须确保“目标”不为空。如果您遇到其他问题,请向 SAP 提交支持票证。

    反复无常。

    -保罗

    【讨论】:

      【解决方案2】:

      可以通过this description 实现对 JCo 异常的基本了解。 SAP documentation 声明了这种异常处理方式:

      JCoDestination destination = JCoDestinationManager.getDestination("<destination>");
      
      try
      {
          JCoContext.begin(destination);
          function1.execute(destination);
          function2.execute(destination);
          functionBapiTransactionCommit.execute(destination);
      }
      catch (AbapException ex)
      {
          ...
      }
      catch (JCoException ex)
      {
          ...
      }
      catch (Exception ex)
      {
          ...
      }
      finally
      {
          JCoContext.end(destination);
      }
      

      【讨论】:

      • 您刚刚发布的样板代码以 JCO 为例,很明显它没有回答我的问题。您的 finally 块调用 JCoContext 的 end() 方法,但没有捕获任何异常。您断言 end() 方法不会引发异常是错误的。 end() 方法的 API 文档指出:“....JCoException - 以防释放/关闭连接遇到问题”。如果这发生在您发布的代码中,则该异常将优先于其上面的 execute() 方法期间的任何先前异常。
      • 是的,我承认我错了。你在 finally 块中使用 eng() 语句吗?也许这个异常是由先前在 catch 块中抛出的异常引起的,被隐藏了?
      • 在 finally 块期间调用 end() 方法(在我的原始帖子和您发布的代码中再次指出)。我专门谈论从 end() 方法抛出的潜在异常。这个方法在什么情况下会抛出异常?如果抛出异常,SAP 中的 LUW 将不会完成。这会很糟糕。 JCO 中似乎没有任何 API 可以解决此问题。因此,我原来的问题。我希望在这里有对 JCO/SAP 代码帮助有深刻理解的人。如果您没有这方面的知识,请不要回复此帖子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2011-05-08
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多