首页 > 解决方案 > 警告:检测到未检测的整个方法('**')或单个调用('!!​​'):

问题描述

设置:

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);
    }
}

原因:

故障排除:

结果

事务确实成功完成。我只需要了解导致警告的我做错了什么。我不应该在 Flow 类中包含辅助方法吗?我是否应该始终使用静态辅助方法创建一个单独的类?

标签: kotlincorda

解决方案


推荐阅读