corda - 节点驱动程序挂起并超时
问题描述
在运行一个简单的节点驱动程序时,我遇到了 NodeDriver 从未见过的问题:
fun main(args: Array<String>) {
val rpcUsers = listOf(User("user1", "test", permissions = setOf("ALL")))
driver(DriverParameters(startNodesInProcess = true, waitForAllNodesToFinish = true)) {
startNode(providedName = CordaX500Name("PartyA", "London", "GB"), rpcUsers = rpcUsers).getOrThrow()
startNode(providedName = CordaX500Name("PartyB", "New York", "US"), rpcUsers = rpcUsers).getOrThrow()
}
}
当我在一个新的 Kotlin 模板 cordapp 项目中运行它时,使用Corda OS 4.1
,它工作正常。但是,当它在我们现有的 cordapp 中运行时,它最终会失败:
java.lang.IllegalStateException: Unable to start notaries. A required port might be bound already.
at net.corda.testing.node.internal.DriverDSLImpl.start(DriverDSLImpl.kt:373) ~[corda-node-driver-4.1.jar:?]
at net.corda.testing.node.internal.DriverDSLImplKt.genericDriver(DriverDSLImpl.kt:966) ~[corda-node-driver-4.1.jar:?]
at net.corda.testing.driver.Driver.driver(Driver.kt:190) ~[corda-node-driver-4.1.jar:?]
at io.bluebank.braid.server.CordaAndBraidStandaloneKt.main(CordaAndBraidStandalone.kt:48) ~[test-classes/:?]
Caused by: java.util.concurrent.TimeoutException
at java.util.concurrent.CompletableFuture.timedGet(CompletableFuture.java:1771) ~[?:1.8.0_212]
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1915) ~[?:1.8.0_212]
at net.corda.core.internal.concurrent.CordaFutureImpl.get(CordaFutureImpl.kt) ~[corda-core-4.1.jar:?]
at net.corda.core.internal.concurrent.CordaFutureImplKt.get(CordaFutureImpl.kt:172) ~[corda-core-4.1.jar:?]
at net.corda.core.utilities.KotlinUtilsKt.getOrThrow(KotlinUtils.kt:134) ~[corda-core-4.1.jar:?]
at net.corda.testing.node.internal.DriverDSLImpl.start(DriverDSLImpl.kt:369) ~[corda-node-driver-4.1.jar:?]
调试这个,当我在任何阻塞它的过程中断点时,所有线程都处于一种WAIT
状态,除了一个叫做SignalDispatcher
which is RUNNING
。没有任何堆栈在 Corda 中。但是,有些在 Quasar 堆栈中被阻挡。
进一步调试,我发现了阻塞行为发生的行:net.corda.node.services.rpc.ArtemisRpcBroker.kt:74
val serverConfiguration = RpcBrokerConfiguration(baseDirectory, maxMessageSize, jmxEnabled, addresses.primary, adminAddressOptional, sslOptions, useSsl, nodeConfiguration, shouldStartLocalShell)
踏入该构造函数,Quasar 接管并似乎ClassLoader.checkPackageAccess
重复调用。允许呼叫继续,它永远不会进入RpcBrokerConfiguration#init
。
以前有没有其他人看到过这个问题,是否有任何解决问题的建议或关于我们如何进一步调试它的线索?谢谢。
PS-这引用了 Corda errorCode 1crywct
。
解决方案
FWIW,我会检查使用相同端口的其他进程,或者只是通过节点驱动程序更改端口。例如,Intellij 附带的 YourKit 默认在端口 10001 上运行,即在默认节点驱动程序公证端口上运行 - 好吧,假设我没记错的话。
推荐阅读
- autosar - Autosar 网络管理 SWS 4.2.2。- 部分网络
- python - 部署 Flask 应用程序时 AWS ElasticBeanstalk 中出现 502 Bad Gateway 错误
- c# - 如何使用 Regex.Match 执行部分搜索并返回完整单词?
- python - Python ValueError: n_splits=3 不能大于每个类的成员数
- javascript - Javascript 问题:thisRate 未在 HTMLInputElement.oninput 中定义
- java - 如何使用 Spring Data 可伸缩地将元素插入到 MongoDB 中的集合字段?
- javascript - youtube iframe api在另一个正在播放时停止视频
- ruby - rake db:seed 无法从 Ruby CLI 应用程序中的 API 播种 - 将播种手动写入的数据 - Ruby/ActiveRecord
- java - 如何在 Java 中正确舍入值?
- excel - 如何将多张工作表复制到单独的工作簿并保存