Во время выполнения потоковых тестов в MockNetwork для проверяющего нотариуса я продолжаю получать сообщения о сбоях потокового тестирования с ошибкой «Контекст транзакции отсутствует». Я тщательно проверил, что нет метода, в котором отсутствует аннотация @Suspendable
. При отладке я заметил, что FinalityFlow не может успешно запустить поток Notary.Client, так как последний не может приостановить работу в FlowStateMachine. Из переполнения стека я обнаружил более раннюю запись об этой ошибке. Однако добавление этого флага -Dco.paralleluniverse.fibers.verifyInstrumentation=true
не дало мне никакой дополнительной информации в выводе. Я собираю свой апплет с открытым исходным кодом corda 4.3 и использую банку quasar-0.7.10, как рекомендовано в документации по corda.
Я что-то здесь упускаю - мне нужно изменить уровни ведения журнала? Информация отправляется в файл? Как я могу правильно провести тест потока, чтобы получить более подробную информацию о выполнении?
Вот исключение, которое я вижу при выполнении моих тестов.
[INFO ] 11:36:28.623 [Mock network] flow. - Flow raised an error: Transaction context is missing. This might happen if a suspendable method is not annotated with @Suspendable annotation.. Sending it to flow hospital to be triaged.
[WARN ] 11:36:28.624 [Mock network] flow. - Caught exception from flow
java.lang.IllegalArgumentException: Transaction context is missing. This might happen if a suspendable method is not annotated with @Suspendable annotation.
at net.corda.node.services.statemachine.FlowStateMachineImpl.checkDbTransaction(FlowStateMachineImpl.kt:230) ~[corda-node-4.3.jar:?]
at net.corda.node.services.statemachine.FlowStateMachineImpl.processEventImmediately(FlowStateMachineImpl.kt:221) ~[corda-node-4.3.jar:?]
at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:291) ~[corda-node-4.3.jar:?]
at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:46) ~[corda-node-4.3.jar:?]
at co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092) ~[quasar-core-0.7.10-jdk8.jar:0.7.10]
at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788) ~[quasar-core-0.7.10-jdk8.jar:0.7.10]
at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) ~[quasar-core-0.7.10-jdk8.jar:0.7.10]
at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) ~[quasar-core-0.7.10-jdk8.jar:0.7.10]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_192]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_192]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[?:1.8.0_192]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[?:1.8.0_192]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_192]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_192]
at net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:63) ~[corda-node-4.3.jar:?]
Сеть MockNetwork инициализируется следующим образом.
val testCordapps = cordappPackages.map { TestCordapp.findCordapp(it) }
val mockNetwork = MockNetwork(
MockNetworkParameters(
cordappsForAllNodes = testCordapps,
notarySpecs = listOf(MockNetworkNotarySpec(NOTARY_LEGAL_NAME, validating = true))
)
)