【问题标题】:More than one version of the flow in the CordappCordapp 中的多个版本的流程
【发布时间】:2020-02-08 02:27:18
【问题描述】:

我想在节点的cordapps 目录中拥有多个版本的某些流对(InitiatingFlowInitiatedBy)。

维护某些流对的多个副本的原因是某些节点可能正在使用流的先前版本,因为它们尚未迁移流的版本。

由于流的版本仅在注释中,我怀疑会有多个类具有相同的完全限定名称。这会导致运行时错误。

您能否提供一个可以保留在同一 cordapps 文件夹中的不同版本的流对示例?

【问题讨论】:

    标签: corda


    【解决方案1】:

    这里的正确做法不是定义几个流对,而是使用InitiatingFlow中的流版本号来控制对应的InitiatedBy流的行为方式。

    例如,假设我们有一个InitiatingFlow

    • 在版本1 中发送Int
    • 在后续版本中发送String

    对应的InitiatedBy 流可能如下所示:

    @Suspendable
    override fun call() {
        val otherFlowVersion = otherSession.getCounterpartyFlowInfo().flowVersion
        val receivedString = if (otherFlowVersion == 1) {
            otherSession.receive<Int>().unwrap { it.toString() }
        } else {
            otherSession.receive<String>().unwrap { it }
        }
    }
    

    通过使用InitiatingFlow 的版本号,InitiatedBy 流能够与运行InitiatingFlow 的任何版本的各方进行通信。

    请注意,InitiatedBy 流没有等效的版本号,这意味着InitiatingFlow 不能以InitiatedBy 流的版本为条件。 InitiatedBy 流程是必须适应处理 InitiatingFlow 中的更改的一方,反之亦然。

    有关流版本控制的更多信息,请访问here

    【讨论】:

      【解决方案2】:

      Corda 的流版本控制模型相当有限。例如,启动流无法调整其行为以使用旧版本的响应流。

      解决此问题的方法是通过协议握手模式。它的工作原理如下。实现一对子流,比如InitiatorProtocolHandshakeFlowRespondToProtocolHandshakeFlow。使 CorDapp 中的每个发起流与另一个笔记建立一个新的流会话来调用与对方会话的InitiatorProtocolHandshakeFlow,并使每个响应流在发送或接收任何其他内容之前与对方会话调用RespondToProtocolHandshakeFlow。制定流程以协商相关的“协议特性”。这可以通过多种方式实现,其中最简单的一种是让响应者发送(和发起者接收)一个简单的版本号。与注释中的流版本号不同,启动流实际上可以根据响应流提供的数字来改变其行为。

      【讨论】:

        猜你喜欢
        • 2018-07-15
        • 2020-12-14
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多