Corda 在运行时修改服务对象的行为

Corda 在运行时修改服务对象的行为,corda,Corda,是否可以在运行时更新/修改Corda service objectsingleton的methodsbehaviour?例如: Corda服务对象中有一个函数,如下所示,该函数跟踪vault更新,对状态数据进行一些处理,然后对外部系统进行API调用。在某些情况下,处理状态数据的逻辑可能会更改,并且希望在运行时修改行为,而无需重新启动corda节点 Corda服务是正确的方式吗? Java instrumentation API或Java Assist或任何其他字节码重写工具是否有帮助 priva

是否可以在运行时更新/修改Corda service objectsingleton的methodsbehaviour?例如:

Corda服务对象中有一个函数,如下所示,该函数跟踪vault更新,对状态数据进行一些处理,然后对外部系统进行API调用。在某些情况下,处理状态数据的逻辑可能会更改,并且希望在运行时修改行为,而无需重新启动corda节点

Corda服务是正确的方式吗? Java instrumentation API或Java Assist或任何其他字节码重写工具是否有帮助

private fun trackVaultAndUpdateExternalSystem() {
val ourIdentity = ourIdentity()
serviceHub.vaultService.trackBy<State>().updates.subscribe { update: Vault.Update<State> ->
    update.produced.forEach { message: StateAndRef<State> ->
        val state = message.state.data
        if (state.recipient == ourIdentity) {
            // do some processing and then make an API call to the external system
        }
    }
}

这可以使用JDWP来完成,但我不推荐这样做。Corda设计用于容忍停机时间。如果您的节点离线一段时间,您将不会丢失消息或导致交易对手观察到错误。如果你的应用程序甚至不能忍受几秒钟的停机时间,那么你需要应用程序热交换,但我们今天不正式支持。

为什么要在运行时更改它?我说的运行时是指不停止corda节点,然后更新corda服务对象并重新启动节点。类似于在不重新启动corda节点的情况下动态更新逻辑。我猜整个服务对象只能有一个实例。明白了,谢谢。我想目前理想的方法是构建一个具有上述功能的容错客户端观察器。这将需要运行配置为主从集群的观察者副本,其中主服务器负责实际执行上述功能,如果主服务器出现故障,其他一些副本将接管。我不确定ZK是否是合适的工具,或者etcd/raft或K8s在开发/维护方面是更好的选择。有什么想法吗?这里的目的是要有一个HA RPC客户端吗?如果是这样的话,我们知道我们需要做更多的工作来实现这一点-这是我们在过去几周里一直在讨论的事情。是的,我们的意图是拥有一个HA RPC客户端。是的,这是我们的不幸。你什么时候需要它?现在不急。如果R3正在为此规划的设计/架构是开源的,那就太好了