在Corda中记录事件的推荐方法
我们正在通过Corda RPC代理上的vaultTrack方法捕获vault中的新提交状态,以用于日志记录。虽然它工作正常,但我们认为它可能会导致一些网络连接开销。因此,我们决定尝试在CorDapp中使用ServiceHub来捕获新事件。不幸的是,每次调用流时(基于可观察的概念?),事件都会持续发生。也许我们没有正确设置?。根据你的经验和专业知识,你能在Corda中记录事件的推荐方法,corda,Corda,我们正在通过Corda RPC代理上的vaultTrack方法捕获vault中的新提交状态,以用于日志记录。虽然它工作正常,但我们认为它可能会导致一些网络连接开销。因此,我们决定尝试在CorDapp中使用ServiceHub来捕获新事件。不幸的是,每次调用流时(基于可观察的概念?),事件都会持续发生。也许我们没有正确设置?。根据你的经验和专业知识,你能 提出问题所在;及 相应的解决方案 详情如下: 因为我们使用CorDapp的日志作为性能基准。因此,我们只关注新的承诺状态事件。在我们启动的API
我们发现,记录在CorDapp中的日志,即流中的日志(来自上述serviceHub),每次调用流时,都会不断获得重复的日志。从我们最初的调查中,我们发现问题在于每次流启动时“vaultService”都会不断获得订阅。因此,我们切换回使用API端点方法。请告诉我们在CorDapp中捕获事件的正确方法。在性能测试期间记录新提交状态的事件。订阅流中可观察到的vault的方法将不起作用。一旦流结束,订阅将不会终止。每次运行流时,都会添加一个额外的订阅服务器。这将降低性能(尽管只要状态序列化足够快,RPC开销通常相当低) 您应该改为使用RPC客户端观察vault的更新。以下是一个例子:
val client = CordaRPCClient(nodeAddress)
val proxy = client.start(rpcUserUsername, rpcUserPassword).proxy
// Track IOUState updates in the vault
val (snapshot, updates) = proxy.vaultTrack(IOUState::class.java)
// Log the existing IOUStates and listen for new ones.
snapshot.states.forEach { logState(it) }
updates.toBlocking().subscribe { update ->
update.produced.forEach { logState(it) }
}
在CordaRPCClient
上调用start
时,您将连接到节点的Artemis消息队列。此消息队列将用于随着时间的推移将更新从vault流回到客户端
在上面的示例中,vault更新仅记录在日志中。您可以根据需要更改此行为(例如,在生成更新时调用API)。您是否认为相同的方法适用于Corda 4?