none
Windows Azure Client Libraries for JavaのBlobコンテナの一覧取得メソッドでエラーが発生する。 RRS feed

  • 質問

  • お世話になります。

    標題の件について何かご存知の方がいましたら教えて下さい。

    CloudBlobClientクラスのlistContainersメソッドを実行するエラーが発生します。

    これは何が原因なのでしょうか?

    単一コンテナの取得はできるものの、一覧の取得ができない状態です。

    【エラー】

    [Storage Exception]
    The server encountered an unknown failure: OK

    [detail Message]
    An error occurred while enumerating the result, check the original exception for details.

    【環境】

    Windows XP

    jdk1.6.0_33

    microsoft-windowsazure-api-0.3.0.jar

    【コード】

    import com.microsoft.windowsazure.services.blob.client.CloudBlobClient;
    import com.microsoft.windowsazure.services.blob.client.CloudBlobContainer;
    import com.microsoft.windowsazure.services.core.storage.CloudStorageAccount;

    public class BolbUtils {

        public static void main(String[] args) {

            try {

                // プロキシ設定
                String proxyhost = "xxxxxxxxxxxxxxxxxx";
                String proxyPort = "xxxxxxxxxx";
                String nonProxyHosts = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                System.setProperty("http.proxyHost", proxyhost);
                System.setProperty("http.proxyPort", proxyPort);
                System.setProperty("https.proxyHost", proxyhost);
                System.setProperty("https.proxyPort", proxyPort);

                // 認証
                CloudStorageAccount account = null;
                String protocol = "http";
                String accountname = "xxxxxxxxxxxxxx";
                String key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                StringBuilder sb = new StringBuilder();
                sb.append("DefaultEndpointsProtocol=");
                sb.append(protocol);
                sb.append(";");
                sb.append("AccountName=");
                sb.append(accountname);
                sb.append(";");
                sb.append("AccountKey=");
                sb.append(key);
                sb.append(";");
                account = CloudStorageAccount.parse(sb.toString());

                CloudBlobClient blobClient = account.createCloudBlobClient();
               
                // コンテナリストの取得
                Iterable<CloudBlobContainer> containerList = blobClient.listContainers();

                for (CloudBlobContainer container : containerList) {

                    System.out.println(container.getName());
                }

                // コンテナの取得
                CloudBlobContainer container = blobClient.getContainerReference("-------");
                System.out.println(container.getName());

            } catch (Exception ee) {
                System.out.println(ee.getMessage());
            }

        }
    }

    以上、宜しくお願いします。

    【追記】

    microsoft-windowsazure-api-0.2.2.jarで同じコードを実行すると、

    エラーが出ませんでした。

    0.3.3は、0.2.2からクラスの追加や修正などかなり修正が入っているようなので

    Blobコンテナの一覧取得のやり方も変わったのでしょうか?



    2012年7月18日 4:28

回答

すべての返信

  • こちらでも0.3.0.jar を利用し、上記プログラムを実行したら例外が発生しました。
    FiddlerにてHTTPの通信を確認しましたが、REST APIの発行は成功し、コンテナ一覧が取得できています。

    例外を見ると、Javaのライブラリ側でパースに失敗しているのかと思われますので、ライブラリの問題かもしれません。

    Caused by: javax.xml.stream.XMLStreamException: LocalName CopyStatus specified did not match with current local name
     at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.require(Unknown Source)
     at com.microsoft.windowsazure.services.core.storage.utils.Utility.readElementFromXMLReader(Utility.java:692)
     at com.microsoft.windowsazure.services.core.storage.utils.Utility.readElementFromXMLReader(Utility.java:670)

    以下でなんらかのIssueが見つかるかも知れません。とりあえず、解決策ではありませんが、参考まで。

    https://github.com/WindowsAzure/azure-sdk-for-java

    2012年7月24日 14:56
  • statemachine様、返信ありがとうございます。

    >例外を見ると、Javaのライブラリ側でパースに失敗しているのかと思われますので、ライブラリの問題かもしれません。

    該当部をデバックして修正してみようと思います。

    >以下でなんらかのIssueが見つかるかも知れません。とりあえず、解決策ではありませんが、参考まで。

    まず、Isusuesの見方から調べてみます!英語わからないのであきらめるかも知れませんが・・・。

    2012年7月25日 7:46
  • すこしデバッグしてみましたが、やはりライブラリ側にバグがあるようです。

    https://github.com/WindowsAzure/azure-sdk-for-java/blob/master/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/blob/client/BlobDeserializationHelper.java#L318

    else if (name.equals(Constants.LEASE_STATUS_ELEMENT)) {
      properties.setLeaseStatus(LeaseStatus.parse(
    Utility.readElementFromXMLReader(xmlr,Constants.COPY_STATUS_ELEMENT)));

    上記(改行コード変更)の COPY_STATUS_ELEMENTは誤りで、LEASE_STATUS_ELEMENT だと思われ、該当箇所を修正してみたら動作しました。

    ソース修正できるようでしたら試してみてください。

    2012年7月25日 14:24
  • statemachine様、返信ありがとうございます。

    昨日デバックしていたところ、同様の内容に気が付きました。

    修正して動作させると正しくコンテナの一覧が取得できるようになりました。

    調査頂きありがとうございます。

    ※ちゃんとテストしているのか疑問に思うコーディングミスですねw

    2012年7月26日 0:18