2017-08-31 60 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")); 
相关问题