在以批处理方式加载数据的应用程序中,Corda如何在没有跟踪或可观察到的情况下并行触发许多流?
在RPC客户端上,只有两种方法(startFlowDynamic和startTrackedFlowDynamic)https://docs.corda.net/api/kotlin/corda/net.corda.core.messaging/-corda-r-p-c-ops/index.html
目标是避免不必要的开销并并行运行许多流。使用跟踪流时,Corda会发出有关未使用的侦听器的警告:https://github.com/corda/corda/blob/release-V3.2/client/rpc/src/main/kotlin/net/corda/client/rpc/internal/RPCClientProxyHandler.kt#L143
答案 0 :(得分:2)
正在发生使用startTrackedFlowDynamic
时出现的警告,因为它返回了几个未使用的Observable
。如警告所述,您将需要先手动关闭未使用的那些,然后订阅它们,或者使用辅助方法net.corda.client.rpc.UtilsKt#notUsed
。
关于并行运行多个流的考虑,您可以执行以下操作:
FlowHandle<Result> flowHandle1 = rpcProxy.startFlowDynamic(ExampleFlow.class, *flow parameters 1*);
FlowHandle<Result> flowHandle2 = rpcProxy.startFlowDynamic(ExampleFlow.class, *flow parameters 2*);
FlowHandle<Result> flowHandle3 = rpcProxy.startFlowDynamic(ExampleFlow.class, *flow parameters 3*);
然后,您可以依次依次等待每个结果Future
对象,以等待所有对象完成:
Arrays.asList(flowHandle1, flowHandle2, flowHandle3).forEach(handle -> {
handle.getReturnValue().get();
});