Cordapp中流程的多个版本

时间:2018-07-17 15:22:59

标签: corda

我想在节点的InitiatingFlow目录中具有多个版本的某些流对(InitiatedBycordapps)。

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

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

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

2 个答案:

答案 0 :(得分:1)

此处的正确方法不是定义多个流对,而是使用InitiatingFlow中的流版本号来控制相应的InitiatedBy流的行为。

例如,假设我们有一个InitiatingFlow

  • 发送Int版的1
  • 在后续版本中发送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中找到。

答案 1 :(得分:0)

Corda对于流的版本控制模型非常有限。例如,启动流无法使其行为适应于旧版本的响应流。

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