如何从 Corda 的 CordApp 中超时/终止正在运行的流程

Posted

技术标签:

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

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

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

我尝试过的事情是:

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

【问题讨论】:

【参考方案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

以上是关于如何从 Corda 的 CordApp 中超时/终止正在运行的流程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cordapp 中对服务和控制器(kotlin)进行单元测试?

在corda shell中将状态对象作为参数传递

将部署升级到 corda 版本 3.1-corda

在 Corda 中将状态标记为已使用而不更改其内容

在corda中使用spring security的基本身份验证

在跨网络部署 Corda 节点时,哪些 JAR 必须完全相同?