Corda:Kryo Buffer Underflow

时间:2018-04-11 16:30:07

标签: corda

我正在尝试使用Corda Explorer通过RPC连接到正在运行的Corda节点。一旦我点击登录,我就会看到这个例外:

(ClientConsumerImpl.java:1122) core.client.run - AMQ214000: Failed to call onMessage
com.esotericsoftware.kryo.KryoException: Buffer underflow.
Serialization trace:
owningKey (net.corda.core.identity.Party)
value (net.corda.core.utilities.Try$Success)
    at com.esotericsoftware.kryo.io.Input.require(Input.java:199) ~[kryo-4.0.0.jar:?]
    at com.esotericsoftware.kryo.io.Input.readVarInt(Input.java:373) ~[kryo-4.0.0.jar:?]
    at com.esotericsoftware.kryo.io.Input.readInt(Input.java:368) ~[kryo-4.0.0.jar:?] 

我已经失去了几个小时的尝试各种想法,以了解问题并解决它。

我的CordaApp非常标准,在节点内加载,我可以通过命令界面启动流程。

由于堆栈跟踪源自Artemis事件处理程序,因此很少有迹象表明问题出现在应用程序级别,因此我可能会遇到如此严重的问题。

发生异常时在资源管理器中执行的代码是:

 var proxy =
        CordaRPCClient(
                nodeHostAndPort,
                CordaRPCClientConfiguration.DEFAULT.copy(
                        connectionMaxRetryInterval = 10.seconds
                )).start(username, password).proxy

下一行会发生实际异常:

    notaryIdentities = proxy.notaryIdentities()

但是,如果我删除对notaryIdentiites的调用,则会发生类似的kryo异常;这让我相信它是序列化层的一个更基本的问题?

在应用程序级别没有代码更改,因此我对可能导致此问题的原因感到十分困惑。我在这里已经阅读了其他问题和答案,这似乎表明它通常是由kyro序列化期间缓冲区管理的线程/竞争条件引起的。

但它突然开始发生的事实是如此令人困惑。

Corda团队能否为我提供一些可能的检查以帮助解决此问题?可能是某种构建/部署/依赖问题吗?

我希望今天/明天解决这个问题,以便能够在本周向管理层演示应用程序,所以非常感谢您的帮助。经过几个小时的浪费,我已经没想完了。

感谢。

3 个答案:

答案 0 :(得分:1)

解决。 这是因为我将CordaApp作为模块添加到IntelliJ中的主要Corda项目旁边,并使用应用程序运行资源管理器。从那里运行gradle任务。从IntelliJ中删除CordaApp模块时,不会发生异常。

我怀疑它是某些java库冲突的地方。

如果有人能提出可能导致此问题的潜在冲突吗?

答案 1 :(得分:1)

Corda 3需要Guava版本19.您的CorDapp直接或间接取决于不同版本的番石榴。

当你的CorDapp加载时,它可能会随后用CorDapp的其他版本的Guava替换Guava版本19类,导致material="transparent:true; src:myImage.png" 例外。

目前没有简单的解决方案,但有一种解决方法是对您的JAR进行着色。请参阅How can CorDapps deal with transitive dependencies

答案 2 :(得分:0)

发生了同样的问题,并将番石榴版本修复为19.0,为我修复了该问题。

添加特定的依赖项:

dependencies {
    compile group: "com.google.guava", name: "guava", version: "19.0"
}