假设有两个节点,爱丽丝和鲍勃。爱丽丝想让鲍勃知道她的状态。爱丽丝如何将状态发送给鲍勃,然后让他将其存储在金库中?
答案 0 :(得分:0)
您将同时需要发起者流程和响应者流程:
启动器流程
@InitiatingFlow
@StartableByRPC
public class Initiator extends FlowLogic<Void> {
private final UUID stateId;
private final Party otherParty;
private final ProgressTracker progressTracker = new ProgressTracker();
public Initiator(UUID stateId, Party otherParty) {
this.stateId = stateId;
this.otherParty = otherParty;
}
@Override
public ProgressTracker getProgressTracker() {
return progressTracker;
}
@Suspendable
@Override
public Void call() throws FlowException {
// Find the correct state.
LinearStateQueryCriteria criteria = new LinearStateQueryCriteria(null, Collections.singletonList(stateId));
Vault.Page<IOUState> queryResults = getServiceHub().getVaultService().queryBy(IOUState.class, criteria);
if (queryResults.getStates().size() != 1)
throw new IllegalStateException("Not exactly one match for the provided ID.");
StateAndRef<IOUState> stateAndRef = queryResults.getStates().get(0);
// Find the transaction that created this state.
SecureHash creatingTransactionHash = stateAndRef.getRef().getTxhash();
SignedTransaction creatingTransaction = getServiceHub().getValidatedTransactions().getTransaction(creatingTransactionHash);
// Send the transaction to the counterparty.
final FlowSession counterpartySession = initiateFlow(otherParty);
subFlow(new SendTransactionFlow(counterpartySession, creatingTransaction));
return null;
}
}
响应流
@InitiatedBy(Initiator.class)
public class Responder extends FlowLogic<Void> {
private final FlowSession counterpartySession;
public Responder(FlowSession counterpartySession) {
this.counterpartySession = counterpartySession;
}
@Suspendable
@Override
public Void call() throws FlowException {
// Receive the transaction and store all its states.
// If we don't pass `ALL_VISIBLE`, only the states for which the node is one of the `participants` will be stored.
subFlow(new ReceiveTransactionFlow(counterpartySession, true, StatesToRecord.ALL_VISIBLE));
return null;
}
}