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的函数调用。