В Corda исключение NullPointerException при вызове DataVendingFlow - PullRequest
0 голосов
/ 28 ноября 2018

В 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: 05,481 [Поток узла-1] (FlowStateMachineImpl.kt: 111) поток. [55214e22-74aa-4f1b-a94d-6353d5bbf35d] .run- Завершено непредвиденным исключением {} java.lang.NullPointerException: пусто в 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.FlowStateMachineImplImpliteMate.kt: 434) ~ [corda-node-3.2-corda.jar :?] at 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 :?] at net.corda.core.flows.FlowLogic.subFlow (FlowLogic.kt: 290) ~ [corda-core-3.2-corda.jar :?] at 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 :?] at net.corda.core.flows.FlowLogic.subFlow (FlowLogic.kt: 290) ~ [corda-core-3.2-corda.jar :?] at net.corda.core.flows.CollectSignaturesFlow.call (CollectSignaturesFlow.kt: 114) ~ [corda-core-3.2-corda.jar :?] at net.corda.core.flows.CollectSignaturesFlow.call (CollectSignaturesFlow.kt: 64) ~ [corda-core-3.2-corda.jar:?] at 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 :?] at 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] at 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] at co.paralleluniverse.fibers.RunnableFiberTask.run (RunnableFiberTask.java:91) [quasar-core-0.7.9-jdk8.jar: 0.7.9] в java.util.concurrent.Executors $ RunnableAdapter.Вызов (Executors.java:511) [?: 1.8.0_191] на java.util.concurrent.FutureTask.run (FutureTask.java:266) [?: 1.8.0_191] на java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.доступ $ 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 (ThreadPoolExec49) [19]в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) [?: 1.8.0_191] в net.corda.node.utilities.AffinityExecutor $ ServiceAffinityExecutor $ 1 $ нить $ 1.run (AffinityExecutor.kt: 62) [corda-node-3.2-corda.jar :?] [ПРЕДУПРЕЖДЕНИЕ] 16: 03: 05,491 [поток узла-1] (StateMachineManagerImpl.kt: 79) поток. [55214e22-74aa-4f1b-a94d-6353d5bbf35d] .uncaughtException- Произошло исключение из потока {} java.lang.IllegalStateException: Ожидалось найти транзакцию, установленную на текущем участке: Fiber @ 10000009: [55214e22-74aa-4f1b-a94d-6353d5bbf35d] [task: co.paralleluniverse.fibers.RunnableFiber75asa@@(Fiber @ 10000009), цель: ноль, планировщик: 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 :?] at net.corda.node.services.statemachine.StateMachineManagerImpl $ initFiber $ 3.invoke (StateMachineManagerImpl.kt: 460) ~ [corda-node-3.2-corda.jar :?] at 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) ~ cord-node-3.2-corda.jar :?] at 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.ScheduledThreadSecutorFecutor.java: 293) [?: 1.8.0_191] в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) [?: 1.8.0_191] в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPo.java: 624) [?: 1.8.0_191] at net.corda.node.utilities.AffinityExecutor$ ServiceAffinityExecutor $ 1 $ thread $ 1.run (AffinityExecutor.kt: 62) [corda-node-3.2-corda.jar:?]

1 Ответ

0 голосов
/ 28 ноября 2018

Начиная с 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))
    }
}
...