Для того, чтобы реализовать какой-либо механизм обратного вызова в моем клиенте, я изучаю события цепного кода. Я нашел этот урок о событиях с цепочкой: https://medium.com/coinmonks/tutorial-chaincode-event-listener-on-hyperledger-fabric-java-sdk-557304f1fe28. Я пытаюсь понять, как прослушивать события на моем клиенте.
Внутри моего Java цепного кода я делаю stub.setEvent(...)
в конце, как в следующем фрагменте:
final byte[] value = new byte[] {0X00};
CompositeKey teaCakeIndexKey = stub.createCompositeKey(INDEX_CERT_PRODUCT,
teaCakeCertificate.getCertNumber(),
teaCakeCertificate.getOwnerUUID(),
teaCakeCertificate.getProductSKU(),
teaCakeCertificate.getUAID());
stub.putState(teaCakeIndexKey.toString(), value);
logger.info("Index key updated");
stub.setEvent("transferOwner", null);
return successfulResponse;
Мое намерение состоит в том, чтобы цепной код возвращал событие после успешной фиксации в книгу.
В моем клиенте у меня есть метод отправки транзакций:
public CustomResponse sendTransaction(String functionName, String[] params)
throws InvalidArgumentException, ProposalException, InterruptedException, TransactionException, IOException {
Channel channel = getChannel();
logger.info("Channel: " + channel.getName());
TransactionProposalRequest tpr = getTransactionProposalRequest(functionName, params);
Collection<ProposalResponse> responses = channel.sendTransactionProposal(tpr);
List<ProposalResponse> invalid = responses.stream().filter(r -> r.isInvalid()).collect(Collectors.toList());
CustomResponse cresp = new CustomResponse();
if (!invalid.isEmpty()) {
invalid.forEach(response -> {
cresp.setStatus("Error");
cresp.setMessage(response.getMessage());
cresp.setTransactionId(response.getTransactionID());
logger.error(response.getMessage());
});
} else {
List<ProposalResponse> verified = responses.stream().filter(r -> r.isVerified()).collect(Collectors.toList());
verified.forEach(response -> {
cresp.setStatus("Success");
cresp.setMessage(response.getMessage());
cresp.setTransactionId(response.getTransactionID());
logger.info(response.getMessage());
});
}
channel.sendTransaction(responses);
return cresp;
}
Пройдя учебник Я до сих пор не уверен, где и как мне следует реализовать механизм прослушивания событий.