Corda 何时将@Suspendable添加到流中的方法?
将方法注释为Corda 何时将@Suspendable添加到流中的方法?,corda,Corda,将方法注释为@Suspendable的最佳实践是什么?在一个流中,可能有多个私有方法查询vault/compute业务逻辑。是否应使用@Suspendable对这些进行注释,以便在节点中途崩溃时可以恢复 或者,@Suspendable是否仅适用于涉及发送/发送和接收的方法,其等待交易对手的响应 来自: Fibre、SuspendableRunnable和SuspendableCallable中的运行方法 声明它们可能引发SuspendExecution异常 @Suspendable是我们指定Su
@Suspendable
的最佳实践是什么?在一个流中,可能有多个私有方法查询vault/compute业务逻辑。是否应使用@Suspendable
对这些进行注释,以便在节点中途崩溃时可以恢复
或者,@Suspendable
是否仅适用于涉及发送
/发送和接收
的方法,其等待交易对手的响应 来自:
Fibre、SuspendableRunnable和SuspendableCallable中的运行方法
声明它们可能引发SuspendExecution异常
@Suspendable是我们指定Suspendable方法的方法,它是通过声明抛出SuspendExecution来实现的。这很方便,因为SuspendExecution是一个检查异常,所以如果f调用g且g是Suspendable,Java编译器将强制我们声明f是Suspendable(这必须是因为它调用g且g可能被挂起)
然而,有时我们不能声明f抛出SuspendExecution。一个例子是f是接口方法的实现,我们不能(或不想)更改接口,使其抛出SuspendExecution
所以,假设方法f是在接口I中声明的,我们希望它在类C中的实现是可挂起的。编译器不允许我们声明抛出SuspendExecution,因为这将与I中f的声明冲突
那么,我们要做的就是用@Suspendable注释(在co.paralleluniverse.fibers包中)注释C.f。假设C.f调用park或其他一些可挂起的方法g(声明抛出SuspendExecution),我们需要用try{}catch(SuspendExecution)包围f的主体,以便该方法能够编译
如果我们想在光纤中运行h,那么它必须是可挂起的,因为它调用的f是可挂起的。我们可以通过用@suspendable注释h或通过声明SuspendExecution将h指定为suspendable
如果我们想在光纤中运行任何方法,那么它必须是可挂起的。
所以基本上,任何调用方法的方法都可以抛出SuspendExecution,或者用@Suspendable
注释
在我的例子中,我从一个函数调用子流时遇到了错误,因为我没有用@Suspendable
注释它,我遇到了类星体异常。由于子流
用@Suspendable
注释,因此我的函数有助于消除这些错误。
错误:检测到未指令的完整方法('**')或单个调用('!!'):
任何启动与其他节点或公证人的流的内容。例如:一个调用子流的函数(该流启动与其他节点的会话)。该函数应该用@Suspendable注释,否则我会看到到处都是类星体错误。那么只执行查询/计算的普通方法呢?添加@Suspendable有什么好处吗?我不这么认为。我在CordaRPCOps.kt中找不到任何带有@Suspendable注释的函数。因此,基本上,标记为suspendable的子流、sendReceive等函数应该从标记为suspendable的函数调用。