在Corda中,调用DataVendingFlow

时间:2018-11-28 10:49:40

标签: corda

在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:?]

1 个答案:

答案 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))
    }
}