2017-08-31 61 views
0

我有我的Hyperledger結構V1.0網絡按照步驟Building Your First Network啓動並運行。使用適用於Hyperledger的Java SDK Client的應用程序結構V1.0在調用chaincode時無限期地等待

現在我可以創建通道安裝/實例化/調用/查詢chaincode

現在我試圖創造一些資產,並使用Java SDK Client查詢相同。

我創建了以下方法來從我的Java應用程序中調用和查詢chaincode。

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

我能夠通過調用

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

創造資產,但是該行BlockEvent.TransactionEvent event = txFuture.get();使得無限期等待狀態的應用程序即使在交易完成承諾臺賬。爲什麼它的行爲如此呢?

一旦我強制退出並運行query()方法,它將列出資產。

+0

你是如何確認的交易承諾? –

+0

正如我剛纔提到的那樣,我強制執行查詢功能並將其列出。我也可以在couchdb UI中看到相同的內容。 – Girish007

回答

1

我碰到類似的問題,網絡上的許多答案都缺少代碼的關鍵部分 - 將EventHub分配給通道。我初始化通道(在這種情況下將在createChannel mehtod)之前加入這個,然後我的交易已成功處理:

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