我正在尝试在Corda中实现以下用例:
已通过startFlowDynamic
在PartyA上调用FlowA。 FlowA创建一个部分签名的事务,并通过sendAndReceive
在PartyB上调用FlowB。人类用户现在应审核并手动批准此交易。理想情况下,FlowB应在收到交易后暂停。我希望能够通过RPC查询FlowB的挂起实例,并在我的UI中向用户显示这些(或者更确切地说是其中的一些事务)。然后,在用户批准后,我想通过RPC恢复FlowB,然后RPC将签署该事务并将其返回给PartyA上的FlowA。
我注意到我可以通过CordaRPCOps.stateMachineAndUpdates在某种程度上检查暂停流程,并且我阅读了有关进度跟踪的教程,但它对我的情况来说还不够。我还读到,与流量中的人进行交互被列为未来特征,我只是想知道是否还有某种方法可以实现这一目标?
答案 0 :(得分:2)
请参阅Negotiation Cordapp示例,了解其在实践中的运作方式here。
Corda目前不支持暂停用户互动流程。
但是,您可以按如下方式支持此类工作流程。假设您正在为贷款申请编写CorDapp。您可以拥有一个初始流程,同意在两方之间创建loanApplication
州。从那里,审批者可以检查贷款申请,并开始创建交易的approve
流程,以将loanApplication
转换为approvedLoan
州,或者启动{{1}流,以消耗reject
状态而不发出loanApplication
状态。
同样,您可以将状态字段添加到approvedLoan
状态,指定loan
是否已获批准。最初,loan
状态将字段设置为loan
。然后,审批者可以启动两个流程之一来更新unapproved
状态,以获得loan
或approved
状态。
答案 1 :(得分:0)
我不确定这是否是推荐的方法"但我在我的流程中实现了与Quasar兼容的AsynchListenableFuture,正如其他人所描述的那样here。
我需要挂起流并等待从另一个流生成状态(响应用户交互)。它似乎有效,但怀疑它可能被视为相当偏离滑雪道(?!)。
将活动拆分为由UI交互直接调用的原子流很好,但我需要一种"监控"在确定下一个启动哪个子流之前等待外部(例如用户)事件的流程,并且这需要在用户交互之前已经调用的流程内自动发生 - 然后流程逻辑以状态改变为条件这可能是由用户交互或来自另一个节点的传入事务引起的。在我的例子中,这个高级监视流程检测节点上已知状态的消耗,然后调用子流作为响应。高级流程等待AsynchListenableFuture,如上面引用的答案中所述。我在感兴趣的合同状态类型的状态属性(例如自定义字段X = Y)上创建了一个复合VaultQuery,并将返回的observable(从trackBy.future返回)转换为Quasar兼容的AsynchListenableFuture。当由外部操作触发的流创建的事务占用状态时,将来返回并且执行自动事件(在我的情况下,与另一方创建其他事务)。
我只是在尝试/评估Corda,不确定这种方法在生产现实中有多强大,但似乎工作正常,希望这会有所帮助。
Corda中某种形式的高级工作流流程可以等待外部事件并根据外部操作有条件地调用其他流程,这对我的上下文非常重要。