在Corda中,调用DataVendingFlow时的NullPointerException

在Corda中,调用DataVendingFlow时的NullPointerException,corda,Corda,在Corda 3.3中,我定义了以下流程: @InitiatingFlow class CollectSignaturesInitiatingFlow(val signedTransaction: SignedTransaction, val parties: List<Party>): FlowLogic<SignedTransaction>() { override fun call(): SignedTransaction { val ses

在Corda 3.3中,我定义了以下流程:

@InitiatingFlow
class CollectSignaturesInitiatingFlow(val signedTransaction: SignedTransaction, val parties: List<Party>): FlowLogic<SignedTransaction>() {
    override fun call(): SignedTransaction {
        val sessions = parties.map { initiateFlow(it) }
        return subFlow(CollectSignaturesFlow(signedTransaction, sessions))
    }
}
当我的节点执行此流时,我收到下面的异常。原因是什么

[警告]16:03:05481[节点线程-1]FlowStateMachineImpl.kt:111 流量。[55214e22-74aa-4f1b-a94d-6353d5bbf35d]。运行-由终止 意外异常{}java.lang.NullPointerException:null 位于net.corda.node.services.statemachine.FlowStateMachineImpl.suspendFlowStateMachineImpl.kt:514 ~[corda-node-3.2-corda.jar:?] net.corda.node.services.statemachine.FlowStateMachineImpl.sendInternalFlowStateMachineImpl.kt:370 ~[corda-node-3.2-corda.jar:?] net.corda.node.services.statemachine.FlowStateMachineImpl.initiateSessionFlowStateMachineImpl.kt:434 ~[corda-node-3.2-corda.jar:?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.sendAndReceiveFlowStateMachineImpl.kt:198 ~[corda-node-3.2-corda.jar:?] 在net.corda.node.services.statemachine.FlowSessionImpl.send和ReceiveFlowSessionImpl.kt:29 ~[corda-node-3.2-corda.jar:?] 在net.corda.node.services.statemachine.FlowSessionImpl.send和ReceiveFlowSessionImpl.kt:40 ~[corda-node-3.2-corda.jar:?] net.corda.core.flows.DataVendingFlow.sendPayloadAndReceiveDataRequestSendTransactionFlow.kt:70 ~[corda-core-3.2-corda.jar:?] net.corda.core.flows.DataVendingFlow.callSendTransactionFlow.kt:48 ~[corda-core-3.2-corda.jar:?] net.corda.core.flows.DataVendingFlow.callSendTransactionFlow.kt:31 ~[corda-core-3.2-corda.jar:?] net.corda.core.flows.FlowLogic.subflowLogic.kt:290~[corda-core-3.2-corda.jar:?] net.corda.core.flows.CollectSignatureFlow.callCollectSignaturesFlow.kt:142 ~[corda-core-3.2-corda.jar:?] net.corda.core.flows.CollectSignatureFlow.callCollectSignaturesFlow.kt:135 ~[corda-core-3.2-corda.jar:?] net.corda.core.flows.FlowLogic.subflowLogic.kt:290~[corda-core-3.2-corda.jar:?] net.corda.core.flows.CollectSignaturesFlow.callCollectSignaturesFlow.kt:114 ~[corda-core-3.2-corda.jar:?] net.corda.core.flows.CollectSignaturesFlow.callCollectSignaturesFlow.kt:64 ~[corda-core-3.2-corda.jar:?] net.corda.core.flows.FlowLogic.subflowLogic.kt:290~[corda-core-3.2-corda.jar:?] 在com.example.flow.ExampleFlowMatching$collectSignatureInitiatingflow.callExampleFlowMatching.kt:280 ~[classes/:?] 在com.example.flow.ExampleFlowMatching$collectSignatureInitiatingflow.callExampleFlowMatching.kt:277 ~[classes/:?] net.corda.core.flows.FlowLogic.subflowLogic.kt:290~[corda-core-3.2-corda.jar:?] 在com.example.flow.ExampleFlowMatching$ExampleFlowMatchingInitiator.callExampleFlowMatching.kt:170 ~[classes/:?] 在com.example.flow.ExampleFlowMatching$ExampleFlowMatchingInitiator.callExampleFlowMatching.kt:45 ~[classes/:?] net.corda.node.services.statemachine.FlowStateMachineImpl.runFlowStateMachineImpl.kt:96 [corda-node-3.2-corda.jar:?] net.corda.node.services.statemachine.FlowStateMachineImpl.runFlowStateMachineImpl.kt:44 [corda-node-3.2-corda.jar:?] 在co.paralleluniverse.fibers.Fiber.run1Fiber.java:1092[quasar-core-0.7.9-jdk8.jar:0.7.9] java:788[quasar-core-0.7.9-jdk8.jar:0.7.9] 位于co.paralleluniverse.fibers.RunnableFiberTask.doExecRunnableFiberTask.java:100 [类星体核心-0.7.9-jdk8.jar:0.7.9] 位于co.paralleluniverse.fibers.RunnableFiberTask.RunnableFiberTask.java:91 [类星体核心-0.7.9-jdk8.jar:0.7.9] 位于java.util.concurrent.Executors$RunnableAdapter.callExecutors.java:511 [?:1.8.0_191] java:266[?:1.8.0_191] 位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201ScheduledThreadPoolExecutor.java:180 [?:1.8.0_191] 位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runScheduledThreadPoolExecutor.java:293 [?:1.8.0_191] 位于java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1149 [?:1.8.0_191] 位于java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:624 [?:1.8.0_191] 在net.corda.node.utilities.AffinityExecutor$serviceffinityExecutor$1$thread$1.runAffinityExecutor.kt:62 [corda-node-3.2-corda.jar:?][WARN]16:03:05491[node-thread-1] StateMachineManagerImpl.kt:79 流量。[55214e22-74aa-4f1b-a94d-6353d5bbf35d]。未捕获异常-已捕获 来自流{}java.lang.IllegalStateException:的异常应为 要查找当前链上的事务集,请执行以下操作: Fiber@10000009:[55214e22-74aa-4f1b-a94d-6353d5bbf35d][任务: 纤维公司。RunnableFiberTask@4ca7589aFiber@10000009, 目标:空,计划程序: net.corda.node.services.statemachine.StateMachineManagerImpl$FiberScheduler@599eed84] 位于net.corda.nodeapi.internal.persistence.DatabaseTransactionKt.getContextTransactionDatab asetransation.kt:14 ~[corda-node-api-3.2-corda.jar:?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.rollbackTransaction$nodeFlowStateMachineImpl.kt:151 ~[corda-node-3.2-corda.jar:?] 位于net.corda.node.services.StateMachineManagerImpl$initFiber$3.invokeStateMachineManagerImpl.kt:460 ~[corda-node-3.2-corda.jar:?] 位于net.corda.node.services.StateMachineManagerImpl$initFiber$3.invokeStateMachineManagerImpl.kt:63 ~[corda-node-3.2-corda.jar:?] 位于net.corda.node.services.statemachine.FlowStateMachineImpl.processExceptionFlowStateMachineImpl.kt:131 ~[corda-node-3.2-corda.jar:?] net.corda.node.services.statemachine.FlowStateMachineImpl.runFlowStateMachineImpl.kt:112 ~[corda-node-3.2-corda.jar:?] net.corda.node.services.statemachine.FlowStateMachineImpl.runFlowStateMachineImpl.kt:44 ~[corda-node-3.2-corda.jar:?] 在co.paralleluniverse.fibers.Fiber.run1Fiber.java:1092[quasar-core-0.7.9-jdk8.jar:0.7.9] java:788[quasar-core-0.7.9-jdk8.jar:0.7.9] 位于co.paralleluniverse.fibers.RunnableFiberTask.doExecRunnableFiberTask.java:100 [类星体核心-0.7.9-jdk8.jar:0.7.9] 位于co.paralleluniverse.fibers.RunnableFiberTask.RunnableFiberTask.java:91 [类星体核心-0.7.9-jdk8.jar:0.7.9] 位于java.util.concurrent.Executors$RunnableAdapter.callExecutors.java:511 [?:1.8.0_191] java:266[?:1.8.0_191] 位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201ScheduledThreadPoolExecutor.java:180 [?:1.8.0_191] 位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runScheduledThreadPoolExecutor.java:293 [?:1.8.0_191] 位于java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1149 [?:1.8.0_191] 位于java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:624 [?:1.8.0_191] 在net.corda.node.utilities.AffinityExecutor$serviceffinityExecutor$1$thread$1.runAffinityExecutor.kt:62 [corda-node-3.2-corda.jar:?]

从Corda 3.3开始,流中的调用方法需要用@Suspendable注释,以便检查其执行情况

因此,您应该按照以下方式重写流程:

@InitiatingFlow
class CollectSignaturesInitiatingFlow(val signedTransaction: SignedTransaction, val parties: List<Party>): FlowLogic<SignedTransaction>() {
    @Suspendable
    override fun call(): SignedTransaction {
        val sessions = parties.map { initiateFlow(it) }
        return subFlow(CollectSignaturesFlow(signedTransaction, sessions))
    }
}