在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))
}
}
当我的节点执行此流程时,我收到以下异常。是什么原因?
[WARN] 16:03:05,481 [Node thread-1](FlowStateMachineImpl.kt:111) flow。[55214e22-74aa-4f1b-a94d-6353d5bbf35d] .run-已终止 意外的异常{} java.lang.NullPointerException:null 在net.corda.node.services.statemachine.FlowStateMachineImpl.suspend(FlowStateMachineImpl.kt:514) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.sendInternal(FlowStateMachineImpl.kt:370) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.initiateSession(FlowStateMachineImpl.kt:434) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.sendAndReceive(FlowStateMachineImpl.kt:198) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowSessionImpl.sendAndReceive(FlowSessionImpl.kt:29) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowSessionImpl.sendAndReceive(FlowSessionImpl.kt:40) 〜[corda-node-3.2-corda.jar :?] 在net.corda.core.flows.DataVendingFlow.sendPayloadAndReceiveDataRequest(SendTransactionFlow.kt:70) 〜[corda-core-3.2-corda.jar :?] 在net.corda.core.flows.DataVendingFlow.call(SendTransactionFlow.kt:48) 〜[corda-core-3.2-corda.jar :?] 在net.corda.core.flows.DataVendingFlow.call(SendTransactionFlow.kt:31) 〜[corda-core-3.2-corda.jar :?] 在net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290)〜[corda-core-3.2-corda.jar :?] 在net.corda.core.flows.CollectSignatureFlow.call(CollectSignaturesFlow.kt:142) 〜[corda-core-3.2-corda.jar :?] 在net.corda.core.flows.CollectSignatureFlow.call(CollectSignaturesFlow.kt:135)处 〜[corda-core-3.2-corda.jar :?] 在net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290)〜[corda-core-3.2-corda.jar :?] 在net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:114) 〜[corda-core-3.2-corda.jar :?] 在net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:64) 〜[corda-core-3.2-corda.jar :?] 在net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290)〜[corda-core-3.2-corda.jar :?] 在com.example.flow.ExampleFlowMatching $ CollectSignaturesInitiatingFlow.call处(ExampleFlowMatching.kt:280) 〜[classes / :?] 在com.example.flow.ExampleFlowMatching $ CollectSignaturesInitiatingFlow.call(ExampleFlowMatching.kt:277)处 〜[classes / :?] 在net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290)〜[corda-core-3.2-corda.jar :?] 在com.example.flow.ExampleFlowMatching $ ExampleFlowMatchingInitiator.call处(ExampleFlowMatching.kt:170) 〜[classes / :?] 在com.example.flow.ExampleFlowMatching $ ExampleFlowMatchingInitiator.call处(ExampleFlowMatching.kt:45) 〜[classes / :?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:96) [corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44) [corda-node-3.2-corda.jar :?] 在co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092)[quasar-core-0.7.9-jdk8.jar:0.7.9] 在co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788)[quasar-core-0.7.9-jdk8.jar:0.7.9] 在co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) [quasar-core-0.7.9-jdk8.jar:0.7.9] 在co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) [quasar-core-0.7.9-jdk8.jar:0.7.9] 在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511) [?:1.8.0_191] 在java.util.concurrent.FutureTask.run(FutureTask.java:266)[?:1.8.0_191] 在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_191] 在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_191] 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_191] 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_191] 在net.corda.node.utilities.AffinityExecutor $ ServiceAffinityExecutor $ 1 $ thread $ 1.run(AffinityExecutor.kt:62) [corda-node-3.2-corda.jar :?] [WARN] 16:03:05,491 [Node thread-1] (StateMachineManagerImpl.kt:79) 流。[55214e22-74aa-4f1b-a94d-6353d5bbf35d] .uncaughtException-已捕获 流{}中的异常java.lang.IllegalStateException:期望 查找当前链上的交易集: Fiber @ 10000009:[55214e22-74aa-4f1b-a94d-6353d5bbf35d] [任务: co.paralleluniverse.fibers.RunnableFiberTask@4ca7589a(Fiber @ 10000009), 目标:null,调度程序: net.corda.node.services.statemachine.StateMachineManagerImpl$FiberScheduler@599eed84] 在net.corda.nodeapi.internal.persistence.DatabaseTransactionKt.getContextTransaction(DatabaseTransaction.kt:14) 〜[corda-node-api-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.rollbackTransaction $ node(FlowStateMachineImpl.kt:151) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.StateMachineManagerImpl $ initFiber $ 3.invoke(StateMachineManagerImpl.kt:460) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.StateMachineManagerImpl $ initFiber $ 3.invoke(StateMachineManagerImpl.kt:63) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.processException(FlowStateMachineImpl.kt:131) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:112) 〜[corda-node-3.2-corda.jar :?] 在net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44) 〜[corda-node-3.2-corda.jar :?] 在co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092)[quasar-core-0.7.9-jdk8.jar:0.7.9] 在co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788)[quasar-core-0.7.9-jdk8.jar:0.7.9] 在co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) [quasar-core-0.7.9-jdk8.jar:0.7.9] 在co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) [quasar-core-0.7.9-jdk8.jar:0.7.9] 在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511) [?:1.8.0_191] 在java.util.concurrent.FutureTask.run(FutureTask.java:266)[?:1.8.0_191] 在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_191] 在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_191] 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_191] 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_191] 在net.corda.node.utilities.AffinityExecutor $ ServiceAffinityExecutor $ 1 $ thread $ 1.run(AffinityExecutor.kt:62) [corda-node-3.2-corda.jar:?]
答案 0 :(得分:1)
从Corda 3.3开始,流中的call
方法需要用@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))
}
}