2017-08-31 1 views
0

Mon réseau Hyperledger Fabric V1.0 est opérationnel en suivant les étapes Building Your First Network.Application utilisant Java SDK Client pour Hyperledger Fabric V1.0 attend indéfiniment lors de l'appel de chaincode

Et maintenant, je suis en mesure de créer canal, install/instancier/Invoke/requête chaincode etc.

Maintenant, je suis en train de créer des actifs et interroger la même chose en utilisant Java SDK Client.

J'ai créé les méthodes suivantes pour appeler et interroger le code de chaîne à partir de mon application Java.

void createChannel() throws InvalidArgumentException, TransactionException, IOException, ProposalException{ 
    Properties ordererProperties = getOrdererProperties("orderer.example.com"); 
    ordererProperties.put("grpc.NettyChannelBuilderOption.keepAliveTime", new Object[] {5L, TimeUnit.MINUTES}); 
    ordererProperties.put("grpc.NettyChannelBuilderOption.keepAliveTimeout", new Object[] {8L, TimeUnit.SECONDS}); 
    Orderer orderer = client.newOrderer("orderer.example.com", "grpcs://192.168.99.100:7050",ordererProperties); 

    Properties peerProperties = getPeerProperties("peer0.org1.example.com"); //test properties for peer.. if any. 
    if (peerProperties == null) { 
     peerProperties = new Properties(); 
    } 
    peerProperties.put("grpc.NettyChannelBuilderOption.maxInboundMessageSize", 9000000); 
    Peer peer = client.newPeer("peer0.org1.example.com", "grpcs://192.168.99.100:7051",peerProperties); 
    channel = client.newChannel("testchannel"); 
    channel.addOrderer(orderer); 
    channel.addPeer(peer); 
    channel.initialize(); 
} 

void creteTransactionalProposal(){ 
    proposalRequest = client.newTransactionProposalRequest(); 
    final ChaincodeID chaincodeID = ChaincodeID.newBuilder() 
      .setName("asset_test") 
      .setVersion("1.0") 
      .setPath("github.com/myuser/myfabricrepo/asset_chain") 
      .build(); 

    proposalRequest.setChaincodeID(chaincodeID); 
    proposalRequest.setFcn("set"); 
    proposalRequest.setProposalWaitTime(TimeUnit.SECONDS.toMillis(1)); 
    proposalRequest.setArgs(new String[]{"a1", "a1_val"}); 
} 

void sendProposal() throws ProposalException, InvalidArgumentException, InterruptedException, ExecutionException{ 
    final Collection<ProposalResponse> responses = channel.sendTransactionProposal(proposalRequest); 
    CompletableFuture<BlockEvent.TransactionEvent> txFuture = channel.sendTransaction(responses, client.getUserContext()); 
    BlockEvent.TransactionEvent event = txFuture.get();//waiting indefinitely 
    System.out.println(event.toString()); 
    //query(); 
} 

void query() throws InvalidArgumentException, ProposalException{ 
    final ChaincodeID chaincodeID = ChaincodeID.newBuilder() 
       .setName(""asset_test"") 
       .setVersion("1.0") 
       .setPath("github.com/myuser/myfabricrepo/asset_chain") 
       .build(); 

    QueryByChaincodeRequest queryByChaincodeRequest = client.newQueryProposalRequest(); 
    queryByChaincodeRequest.setArgs(new String[] {"a1"}); 
    queryByChaincodeRequest.setFcn("get"); 
    queryByChaincodeRequest.setChaincodeID(chaincodeID); 

    Map<String, byte[]> tm2 = new HashMap<>(); 
    tm2.put("HyperLedgerFabric", "QueryByChaincodeRequest:JavaSDK".getBytes(UTF_8)); 
    tm2.put("method", "QueryByChaincodeRequest".getBytes(UTF_8)); 
    queryByChaincodeRequest.setTransientMap(tm2); 

    Collection<ProposalResponse> queryProposals = channel.queryByChaincode(queryByChaincodeRequest, channel.getPeers()); 
    for (ProposalResponse proposalResponse : queryProposals) { 
     if (!proposalResponse.isVerified() 
       || proposalResponse.getStatus() != ProposalResponse.Status.SUCCESS) { 
      System.out.println("Failed query proposal from peer " + proposalResponse.getPeer().getName() + " status: " 
        + proposalResponse.getStatus() + ". Messages: " + proposalResponse.getMessage() 
        + ". Was verified : " + proposalResponse.isVerified()); 
     } else { 
      String payload = proposalResponse.getProposalResponse().getResponse().getPayload() 
        .toStringUtf8(); 
      System.out.printf("\nQuery payload of b from peer %s returned %s", proposalResponse.getPeer().getName(), 
        payload); 
      //assertEquals(payload, expect); 
     } 
    } 
} 

Je suis en mesure de créer des actifs en appelant

t.creteTransactionalProposal(); 
t.sendProposal(); 

Mais la ligne BlockEvent.TransactionEvent event = txFuture.get(); fait l'application dans un état d'attente indéfinie, même après l'achèvement de la transaction engage à grand livre. Pourquoi il se comporte comme ça?

Une fois que je forcer quitter et exécuter la méthode query(), il répertorie l'actif.

+0

Comment avez-vous confirmé la transaction engagée? –

+0

Comme je l'ai mentionné une fois que je force tout à fait et exécutez la fonction de requête c'est la liste. Aussi, je peux voir la même chose dans l'interface utilisateur couchdb. – Girish007

Répondre

1

Je me suis heurté à un problème similaire à celui-ci, et la plupart des réponses autour du réseau manquent une partie clé du code - assignant le EventHub au canal. J'ai ajouté cela avant d'initialiser le canal (qui dans ce cas serait dans le mehtod createChannel), et mes transactions ont ensuite été traitées avec succès:

channel.addEventHub(client.newEventHub("eventhub0", "grpc://localhost:7053"));