2017-08-31 9 views
0

私はJavaウォレット生成コードを書きました。私は暗号化ウォレットを生成するためにこのコードを使用します。コードは、私がnullの取得、POST要求はMySQLで維持されましたが、nullを返します

public synchronized WalletInfo generateAddress(GenerateWallet generateWallet) { 

     final WalletInfo walletInfo = new WalletInfo(); 

     String walletName = generateWallet.getWalletName(); 

     String currencyName = generateWallet.getCurrencyName(); 

     WalletInfo walletInfoDb = iWalletInfoDao.getWalletInfoWithWalletNameAndCurrency(walletName, currencyName); 

     if (walletInfoDb == null && genWalletMap.get(walletName) == null) { 

      String currency = currencyName.toUpperCase(); 

      if (currency.equals("BITCOIN")) { 

       final WalletManager walletManager = WalletManager.setupWallet(walletName); 

       walletManager.addWalletSetupCompletedListener((wallet) -> { 

        Address address = wallet.currentReceiveAddress(); 
        WalletInfo newWallet = createWalletInfo(walletName, currencyName, address.toString()); 

        // set the properties of the walletInfo 
        walletInfo.setId(newWallet.getId()); 
        walletInfo.setName(newWallet.getName()); 
        walletInfo.setAddress(newWallet.getAddress()); 
        walletInfo.setCurrency(newWallet.getCurrency()); 

        walletMangersMap.put(newWallet.getId(), walletManager); 
        genWalletMap.remove(walletName); 
       }); 

       genWalletMap.put(walletName, walletManager); 
       return walletInfo; 
      } else if (currency.equals("ETHEREUM")) { 
       return walletInfo; 
      } else { 
       return walletInfo; 
      } 
     } 

     return walletInfo; 
    } 

私はカールを使用してPOSTリクエストを行い、

curl -H "Content-Type: application/json" -X POST -d '{"walletName": "Florence8","currencyName":"Bitcoin"}' http://localhost:8080/rest/wallet/generateAddress 

を提供している組織がまだ発生している間に、戻り、

{ 
    "id" : null, 
    "name" : null, 
    "address" : null, 
    "currency" : null 
} 

ですMySQLで永続化されました。私はデバッグを続け、これは有線です。デバッグは、コードの上から下へのシーケンスに従いません。デバッグのシーケンスは同様で、

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

コードが来る場合、私はしたいと思いポイントですこの行へ walletManager.addWalletSetupCompletedListener((wallet)の場合、内部で操作を実行する必要があります。

どのような提案データベースに正しく保存された後、エンティティを元に戻すにはどうすればよいですか?その答えで示唆したように

更新

を必要に応じて、私はより多くの情報を提供することができ、私は、CountDownLatchを使用して、問題

public synchronized WalletInfo generateAddress(GenerateWallet generateWallet) { 

     CountDownLatch finshedSetup = new CountDownLatch(1); 

    // some code 
} 

の端子で出力を解決

enter image description here

答えて

1

あなたは競争状態に陥っているようです。 walletInfoを埋め込むようにコールバックを設定していますが、コールバックが実行される前にwalletInfoを返す可能性があります。

戻ってくる前に待つべき約束やラッチのいくつかのタイプが役に立ちます。例:

public synchronized WalletInfo generateAddress(GenerateWallet generateWallet) { 

     final WalletInfo walletInfo = new WalletInfo(); 

     String walletName = generateWallet.getWalletName(); 

     String currencyName = generateWallet.getCurrencyName(); 

     WalletInfo walletInfoDb = iWalletInfoDao.getWalletInfoWithWalletNameAndCurrency(walletName, currencyName); 

     if (walletInfoDb == null && genWalletMap.get(walletName) == null) { 

      String currency = currencyName.toUpperCase(); 

      if (currency.equals("BITCOIN")) { 

       final WalletManager walletManager = WalletManager.setupWallet(walletName); 
       CountDownLatch finishedSetup = new CountDownLatch(1); 

       walletManager.addWalletSetupCompletedListener((wallet) -> { 

        Address address = wallet.currentReceiveAddress(); 
        WalletInfo newWallet = createWalletInfo(walletName, currencyName, address.toString()); 

        // set the properties of the walletInfo 
        walletInfo.setId(newWallet.getId()); 
        walletInfo.setName(newWallet.getName()); 
        walletInfo.setAddress(newWallet.getAddress()); 
        walletInfo.setCurrency(newWallet.getCurrency()); 

        walletMangersMap.put(newWallet.getId(), walletManager); 
        genWalletMap.remove(walletName); 
        finshedSetup.countDown(); 
       }); 

       genWalletMap.put(walletName, walletManager); 
       finishedSetup.await(); 
       return walletInfo; 
      } else if (currency.equals("ETHEREUM")) { 
       return walletInfo; 
      } else { 
       return walletInfo; 
      } 
     } 

     return walletInfo; 
    } 
+0

私はマルチスレッドの知識が限られています。あなたはそれを解決するために私を助けてくれますか?私は必要なコードの他の部分を提供することができます。 – Arefe

+0

@Artinがカウントダウンラッチの例で更新されました。ラッチの仕組みの詳細は、https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html –

+0

答えとアップデートをありがとう。コード内の 'finishedSetup'メソッドは何ですか?あなたは例を挙げることができますか?私は何が起こっているのかを理解するとすぐにそれを受け入れるでしょう – Arefe

関連する問題