我想在节点的InitiatingFlow
目录中具有多个版本的某些流对(InitiatedBy
和cordapps
)。
之所以要维护某些流对的多个副本,是因为某些节点可能正在使用流的先前版本,因为它们尚未迁移流的版本。
由于流程的版本仅在注释中,因此我怀疑会有多个具有相同完全限定名称的类。这将导致运行时错误。
您能否提供可以保留在同一cordapps
文件夹中的具有不同版本的流对的示例?
答案 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对于流的版本控制模型非常有限。例如,启动流无法使其行为适应于旧版本的响应流。
可以解决此问题的方法是通过协议握手模式。它的工作原理如下。实现一对子流,例如InitiatorProtocolHandshakeFlow
和RespondToProtocolHandshakeFlow
。使CorDapp中的每个启动流与另一个注释建立新的流会话,以与对方会话调用InitiatorProtocolHandshakeFlow
,并使每个响应流在对方发送或接收任何其他内容之前与对方会话调用RespondToProtocolHandshakeFlow
。进行流程协商相关的“协议功能”。这可以通过多种方式实现,其中最简单的一种是使响应者发送(发起者以接收)的简单版本号。与注释中的流版本号不同,发起流实际上可以根据响应流提供的数目来更改其行为。