kotlin - 警告:检测到未检测的整个方法('**')或单个调用('!!'):
问题描述
设置:
Corda:4.6 - 在本地运行 Corda 节点并使用 RPC 连接
问题:
运行 Flow 时,我在 Receiver 的 CRaSH shell 上收到多个类似这样的警告:
WARNING: Uninstrumented whole methods ('**') or single calls ('!!') detected:
at co.paralleluniverse.common.util.ExtendedStackTrace.here() (ExtendedStackTrace.java:46 bci: 8)
at co.paralleluniverse.fibers.Fiber.checkInstrumentation() (Fiber.java:1707 bci: 0)
at co.paralleluniverse.fibers.Fiber.verifySuspend(co.paralleluniverse.fibers.Fiber) (Fiber.java:1680 bci: 6)
at co.paralleluniverse.fibers.Fiber.verifySuspend() (Fiber.java:1675 bci: 3)
at co.paralleluniverse.fibers.Fiber.park(java.lang.Object,co.paralleluniverse.fibers.Fiber$ParkAction,long,java.util.concurrent.TimeUnit) (Fiber.java:654 bci: 0)
at co.paralleluniverse.fibers.Fiber.park(java.lang.Object,co.paralleluniverse.fibers.Fiber$ParkAction) (Fiber.java:658 bci: 4)
at co.paralleluniverse.fibers.Fiber.parkAndSerialize(co.paralleluniverse.fibers.FiberWriter) (Fiber.java:2018 bci: 11)
at net.corda.node.services.statemachine.FlowStateMachineImpl.suspend(net.corda.core.internal.FlowIORequest,boolean) (FlowStateMachineImpl.kt:527 bci: 160)
at net.corda.node.services.statemachine.FlowSessionImpl.send(java.lang.Object,boolean) (FlowSessionImpl.kt:78 bci: 199)
at net.corda.node.services.statemachine.FlowSessionImpl.send(java.lang.Object) (FlowSessionImpl.kt:82 bci: 113)
at net.corda.core.internal.ResolveTransactionsFlow.call() (ResolveTransactionsFlow.kt:64 bci: 726)
at net.corda.core.internal.ResolveTransactionsFlow.call() (ResolveTransactionsFlow.kt:20 bci: 1)
at net.corda.node.services.statemachine.FlowStateMachineImpl.subFlow(net.corda.core.flows.FlowLogic,net.corda.core.flows.FlowLogic) (FlowStateMachineImpl.kt:417 bci: 412)
at net.corda.core.flows.FlowLogic.subFlow(net.corda.core.flows.FlowLogic) (FlowLogic.kt:414 bci: 210)
at net.corda.core.flows.ReceiveTransactionFlow.call() (ReceiveTransactionFlow.kt:50 bci: 446)
at net.corda.core.flows.ReceiveTransactionFlow.call() (ReceiveTransactionFlow.kt:31 bci: 1)
at net.corda.node.services.statemachine.FlowStateMachineImpl.subFlow(net.corda.core.flows.FlowLogic,net.corda.core.flows.FlowLogic) (FlowStateMachineImpl.kt:417 bci: 412)
at net.corda.core.flows.FlowLogic.subFlow(net.corda.core.flows.FlowLogic) (FlowLogic.kt:414 bci: 210)
at net.corda.core.flows.ReceiveFinalityFlow.call() (FinalityFlow.kt:285 bci: 106)
at net.corda.core.flows.ReceiveFinalityFlow.call() (FinalityFlow.kt:280 bci: 1)
at net.corda.node.services.statemachine.FlowStateMachineImpl.subFlow(net.corda.core.flows.FlowLogic,net.corda.core.flows.FlowLogic) (FlowStateMachineImpl.kt:417 bci: 412)
at net.corda.core.flows.FlowLogic.subFlow(net.corda.core.flows.FlowLogic) (FlowLogic.kt:414 bci: 210)
at com.template.flows.purchaseForward.PurchaseForwardReceive.call() (PurchaseForwardReceive.java:148 bci: 2213) !! (instrumented suspendable calls at: lines [81, 81, 84, 84, 87, 87, 97, 100, 105, 116, 120, 124, 132, 135, 148], calls [net.corda.core.utilities.UntrustworthyData.unwrap(net.corda.core.utilities.UntrustworthyData$Validator), com.template.flows.purchaseForward.Utilities.findOffer(net.corda.core.contracts.StateRef, net.corda.core.node.ServiceHub), com.template.flows.purchaseForward.PurchaseForwardReceive.checkOffer(com.template.states.offer.Offer), com.template.flows.purchaseForward.PurchaseForwardReceive.getPrice(java.lang.Long, com.template.states.offer.Offer), com.template.flows.purchaseForward.PurchaseForwardReceive.checkInventory(java.lang.Long, com.template.states.offer.Offer), net.corda.core.flows.FlowSession.send(java.lang.Object), net.corda.core.flows.FlowSession.receive(java.lang.Class), com.template.flows.purchaseForward.PurchaseForwardReceive.checkPrice(net.corda.core.contracts.Amount, net.corda.core.contracts.Amount), com.template.flows.purchaseForward.PurchaseForwardReceive.countStates(java.lang.Class), com.template.flows.purchaseForward.PurchaseForwardReceive.subFlow(net.corda.core.flows.FlowLogic)])
at com.template.flows.purchaseForward.PurchaseForwardReceive.call() (PurchaseForwardReceive.java:26 bci: 1) (optimized)
at net.corda.node.services.statemachine.FlowStateMachineImpl.run() (FlowStateMachineImpl.kt:346 bci: 346)
at net.corda.node.services.statemachine.FlowStateMachineImpl.run() (FlowStateMachineImpl.kt:71 bci: 1)
at co.paralleluniverse.fibers.Fiber.run1() (Fiber.java:1105 bci: 1)
简化流程设置:
@StartableByRPC
@InitiatingFlow
class Sender extends FlowLogic<SignedTransaction> {
@Suspendable
@Override
public SignedTransaction call() throws FlowException {
StateAndRef<ContractState> stateAndRef= helperMethodSender() //<- Does not cause warnings
flowSession.send(...)
flowSession.send(...)
flowSession.send(...)
flowSession.receive(...)
CollectSignaturesFlow()
FinalityFlow()
ReportToObserverFlow()
}
@Suspendable
private StateAndRef<ContractState> helperMethodSender() {
return getServiceHub().getVaultService().queryBy(ContractState.class).getStates().get(0);
}
}
接收流程:
@InitiatedBy(Sender.class)
class Receiver extends FlowLogic<Void> {
@Suspendable
@Override
public Void call() throws FlowException {
flowSession.receive(...)
flowSession.receive(...)
flowSession.receive(...)
StateAndRef<ContractState> stateAndRef = helperMethodReceiver() //<- Causes warnings
flowSession.send(...)
SignTransactionFlow()
ReceiveFinalityFlow()
}
@Suspendable
private StateAndRef<ContractState> helperMethodReceiver() {
return getServiceHub().getVaultService().queryBy(ContractState.class).getStates().get(0);
}
}
原因:
- 如果我在 helperMethodReceiver() 中使用保管库服务并将返回值分配给变量,我将收到警告。
故障排除:
如果我不将返回值分配给变量,我将不会收到警告。
如果我将 helperMethodReceiver() 移动到另一个类,我不会收到警告。
在 helperMethodReceiver() 中调用其他 ServiceHub 方法不会导致警告。
发件人对 helperMethodSender() 的调用不会导致警告。
结果
事务确实成功完成。我只需要了解导致警告的我做错了什么。我不应该在 Flow 类中包含辅助方法吗?我是否应该始终使用静态辅助方法创建一个单独的类?
解决方案
推荐阅读
- jquery - 通过基于 jquery 的值通配符从 Select 中删除值
- python - Anaconda 无法将 python 降级到 3.6,也无法安装 tensorflow
- android - ZipWith 的 Rxjava 间隔不能按预期工作
- python - Python:从 np.where() 重新排列索引
- python - __setattr__ 未检测到 .append() 更改
- python - 使用 argparse 让 python 文件根据输入参数返回不同的值
- ruby-on-rails - 尝试在 Rails 中呈现 JSON 错误“找不到带有 id 的计划”但不能
- reactjs - 如何从 axios 获取等待函数中的 onUploadProgress 值?
- android - 如何使用 Android Studio 创建具有动态项目数的列表
- css - 如何将样式应用于 Blazor 输入元素