【问题标题】:How can i timeout/terminate a running Flow from within the CordApp in Corda如何从 Corda 的 CordApp 中超时/终止正在运行的流程
【发布时间】:2022-01-20 15:06:39
【问题描述】:

我实现了两个流程(启动流程和响应流程),每 X 分钟从我的服务运行一次。他们同时使用了发送和接收方法。当一个节点宕机时,Flow 会留在内存中,不会返回或抛出异常。这变成了一个问题,因为在同一时间运行的流太多,节点会在一段时间后崩溃。

我的问题是如何在 X TIME 后自动使 Flow 超时。或者我怎样才能从 CordApp 中终止流?

我尝试过的事情是:

  1. 从 RPCOps 杀死流 - 没用,因为我想从 Cordapp 中删除它
  2. 从 shell 中杀死流 - 没有用,因为我想在某些条件下在代码中删除它
  3. 让 Flow 从 TimedFlow 继承并相应地设置参数 - 文档说这实际上不会杀死 Flow,而只是重新启动它

【问题讨论】:

    标签: kotlin corda


    【解决方案1】:

    您面临的根本问题是同时运行的流程太多。如果您使用的是 Corda Open Source v4.x,请记住它是单线程的,因此如果您需要并行运行多个流程,您应该切换到多线程的 Corda Enterprise。

    更具体地说是关于流的终止。在您的情况下,Responder 流程​​似乎存在一些问题,因此导致 Initiating 流程永远等待永远不会到达的响应。这是正常行为。由于流程是从 Initiating 流程开始的,因此您需要将其终止,您不能从 Initiating 流程终止 Responder 流程​​(这就是您在此问题中要问的内容)。

    你想要做的在理论上也是错误的。这意味着,在一个分布式网络中,Initiating 和 Responder 流在属于两个不同组织的两个不同节点上运行,第一个可以控制另一个的操作。这不是 DLTs/blockchains 应该如何工作,而是在标准的客户端/服务器架构中是正常的。

    终止 Initiating 流的唯一方法是从节点终端或使用 CordaRPC 从外部客户端。

    【讨论】:

    • 感谢您的回答。实际上,我的 Flows 工作正常,我只是假设当一个节点脱机时,Flows 仍然在等待该节点再次上线,并且新的 Flows 将每 X 分钟启动一次……我找到了一种方法来超时我的启动通过扩展 TimedFlow 来流动。在每次启动/重新启动时,Flow 检查自第一次启动以来已经过去了多少分钟,如果超过 X 分钟,我会抛出 FlowException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2021-10-05
    • 2012-09-07
    • 2018-08-12
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多