如何正确处理SAP Kapsel Offline app OData冲突?

时间:2017-03-07 16:07:16

标签: cordova-plugins sapui5 sap-smp

我构建了一个能够使用SAP Kapsel插件离线存储OData的应用程序。 或多或少与此示例中的WEB ID或similer生成的相同:https://blogs.sap.com/2017/01/24/getting-started-with-kapsel-part-10-offline-odatasp13/

现在,我正在检查错误解决方案的潜力。我创建了一个同步冲突(在存储脱机数据库之后在服务器上查找数据并在应用程序上更改某些内容并启动刷新)。

如文档中所述,我可以在ErrorArchive中看到错误,也可以看到一些细节。但我缺少的是"当前"数据库上的数据。

在错误细节中,我只能看到设备上的数据,但不能看到服务器上更改的数据。

例如:

  1. 设备正在将某些名称加载到离线商店
  2. 设备已离线
  3. 用户A正在更改某些名称
  4. 用户B正在直接在线更改其中一个名称
  5. 用户A再次在线并开始同步
  6. 用户A现在提供有关已更改的实体的信息但是:
    • 不是内容用户B输入
  7. 我只看到"离线"数据

    是否有解决方案可以看到"当前"和#34;离线"一种比较观点?

    请注意,服务器通信由Kapsel插件完成,而不是正常的AJAX调用。这可能是另一种选择,但我想知道API是否支持更智能的方式?

    同时我想出了如何加载在线数据(手动)。 这可以通过将http处理程序切换回正常处理程序来完成。

    sap.OData.removeHttpClient();
    sap.OData.applyHttpClient();
    

    无论如何这看起来不是一个合适的解决方案,我也有冲突日志本身的问题。必须先删除它,然后才能应用任何刷新。

    我找不到任何适当的文件。在SAPUI5和SAP Kapsel文档中也很难描述ETag处理。

2 个答案:

答案 0 :(得分:2)

由于其含义,这个问题非常棘手。我知道您正在模拟由于并发修改而导致的同步错误,并想知道客户端是否有办法获取" current"服务器状态,以便为用户提供比较本地和服务器状态的方法。

首先,让我简单回答一下:不,客户端无法看到当前服务器状态"供参考"存在同步错误时通过脱机API。如上所述进行在线查询可能有效,但肯定是个坏主意。

现在有了更长的答案,这就解释了为什么这不一定是一个缺陷,为什么我说这对答案有很多影响。

同步错误的类型

We distinguish a number of synchronization errors,在这种情况下,我们显然正在处理与业务相关的问题。这里有两种子类型:用户可以纠正的子类型,例如验证错误,以及业务流程本身存在问题的错误。

如果用户违反了输入范围,例如通过为产品设置负价格,服务器将回复相应的消息:" -1不是' Price'"的有效输入值。作为开发人员,您可以从错误存档中向用户显示此类消息,随后的修复确实非常简单。

现在,当我们讨论并发修改时,事情真的变得非常糟糕。事实上,我想说在这种情况下业务流程存在问题,因为一方面,我们允许数据不同步。另一方面,该过程允许多个用户操纵同一条信息。现在应该如何通知和同步所有相关用户,不仅仅是技术细节,而且实际上是一个新的业务流程。没有办法一般地设置如何处理这种情况。在大多数情况下,它将涉及需要决定如何合并变更的后台专家。

更好的解决方案

Angstrom指出,没有办法在客户端操纵ETag,事实上你甚至不应该考虑它。 ETag在乐观锁定场景中的工作类似于版本号,并且更改ETag基本上意味着"只是覆盖服务器上的内容"。在严肃的情况下,这是一个禁忌。

可接受的解决方法如下:

  1. 确保服务器返回详细的错误消息,以便用户可以查看发生的情况以及导致冲突的原因。
  2. 如果没有帮助,请刷新数据。这将为您提供更新的ETag,并将本地更改合并到" current"服务器状态,但仅限本地。 "合并"实际上意味着本地更改总是会覆盖远程更改。
  3. 用户现在有另一次机会审核数据并可以再次提交。
  4. 一个好的解决方案

    更好不一定是好的,所以这就是你应该做的事情:永远不要让并发修改发生,因为处理它真的很贵。这意味着开发人员不应该解决这个问题,但是企业需要改变这个过程。

    要问的正确问题是,"当您在分布式系统中复制数据时,为什么要允许它同时进行修改?"通常,利益相关者不会喜欢这样的问题,适当的反应是与他们一起制定冲突解决流程。只有这样,他们才会意识到修复这种去同步化的成本是多么昂贵,而且他们往往会认为调整流程比坚持另一个后台流程来解决它导致的问题要便宜得多。即使他们坚持认为需要进行这种同时修改,他们现在也会明白,解决这个问题不是你的任务,他们需要投资于冲突解决过程。

    TL; DR

    无法将服务器和客户端状态与客户端上的服务器状态进行比较,但您可以执行刷新以保留本地更改并获取更新的ETag。然而,真正的解决方案是重新设计业务流程,因为这不再是纯粹的技术问题。

答案 1 :(得分:1)

默认解决方案是SMP或HCPms正在通过ETag检测错误。在客户端,没有API可以在发生冲突时操纵ETag。在设备上实现一种差异视图的潜在解决方案可以这样工作:

  1. 显示错误
  2. 缓存错误(可能只在内存中?)
  3. 删除错误
  4. 刷新数据库
  5. 使用当前数据和缓存错误构建差异视图
  6. 的想法
    sap.OData.removeHttpClient();
    sap.OData.applyHttpClient();
    

    也可以工作,但可能非常棘手,可能会引入副作用。 也许某些请求是针对“错误的”后端触发的。