如何通过FlowSession.send()方法向Receiver类传递多个变量?
关于Corda FlowSession.send()传递多个变量的问题
当然可以通过FlowSession.send()传递多个变量啦!你遇到的问题本质是发送和接收的调用次数不匹配导致的——你发起方发了两次,但接收方只接了一次,第二个变量自然没被处理到。
问题出在哪?
你在Payer类里调用了两次sessionWithRecipient.send(),但Receiver类里只写了一次initiatorSession.receive<Int>().unwrap(...),相当于只“接了第一份快递”,第二份还在传输队列里没人取,所以看起来只有第一个变量生效。
正确的处理方式
发起方(Payer)代码示例:
// 发送第一个变量 sessionWithRecipient.send(variable1) // 发送第二个变量 sessionWithRecipient.send(variable2)
接收方(Receiver)代码示例:
// 先接收第一个Int类型变量 val variable1 = initiatorSession.receive<Int>().unwrap { it } // 再接收第二个变量(根据实际类型调整泛型) val variable2 = initiatorSession.receive<String>().unwrap { it } // 假设第二个是String类型
注意:每次send()都要对应一次receive(),而且泛型类型要和发送的变量类型严格匹配,不然会抛出类型不匹配的异常。
更优雅的方案:封装成数据类
如果要传递的变量比较多,或者是一组关联紧密的数据,建议把它们封装成一个自定义数据类,一次性发送:
- 先定义数据类(要确保这个类在双方节点的代码中都能访问到):
data class TransactionDetails(val amount: Int, val payerRef: String, val receiverRef: String)
- 发起方发送封装后的对象:
val details = TransactionDetails(variable1, variable2, variable3) sessionWithRecipient.send(details)
- 接收方一次性接收并解析:
val transactionDetails = initiatorSession.receive<TransactionDetails>().unwrap { it } val amount = transactionDetails.amount val payerRef = transactionDetails.payerRef // ... 按需提取其他变量
这种方式不仅代码更整洁,还能从根源上避免因发送/接收次数不一致导致的变量遗漏问题。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

