Search code examples
javaazureazure-storageazure-blob-storageazure-api-management

Azure SDK API and JAVA usage - Issue Listing all Containers and BLOBS inside a storage account


Issues while using client.listContainers() and container.listBlobs() functions and getting below JAVA exception. Tried to access them individually with reference methods and it works fine. Not sure why this is happening as there are no access restrictions i.e public access and getting the client reference without any issues of Connection String.


Exception:

java.util.NoSuchElementException: An error occurred while enumerating the result, check the original exception for details.
java.util.NoSuchElementException: An error occurred while enumerating the result, check the original exception for details.
at com.microsoft.azure.storage.core.LazySegmentedIterator.hasNext(LazySegmentedIterator.java:113)
at com.company.test.core.handler.AzureHeirarchyGenerator.getAzureFileList(AzureHeirarchyGenerator.java:69)
at com.company.test.core.handler.AzureHeirarchyGenerator.main(AzureHeirarchyGenerator.java:18)
Caused by: com.microsoft.azure.storage.StorageException: An unknown failure occurred : Connection refused: connect
at com.microsoft.azure.storage.StorageException.translateException(StorageException.java:66)
at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:209)
at com.microsoft.azure.storage.core.LazySegmentedIterator.hasNext(LazySegmentedIterator.java:109)
... 2 more
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:673)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347)
at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:115)
... 3 more

Code Snippet JAVA:

    CloudStorageAccount account = CloudStorageAccount.parse(azureConnectionString);
    CloudBlobClient client = account.createCloudBlobClient();
    // List all containers of a storage account
    Iterable<CloudBlobContainer> containers = client.listContainers();
    for (CloudBlobContainer cloudBlobContainer : containers) {
        Iterable<ListBlobItem> blobs = cloudBlobContainer.lisBlobs();
        System.out.println("Code to fetch blobs inside container");
    }

Solution

  • I have tested your code and it worked fine in my environment as below:

    enter image description here

    Here is my full code for your reference:

    import java.net.URISyntaxException;
    import java.security.InvalidKeyException;
    import com.microsoft.azure.storage.CloudStorageAccount;
    import com.microsoft.azure.storage.blob.CloudBlobClient;
    import com.microsoft.azure.storage.blob.CloudBlobContainer;
    import com.microsoft.azure.storage.blob.ListBlobItem;
    
    public class Main {
    
        public static void main(String[] args) {
        // TODO Auto-generated method stub
    
        CloudStorageAccount account;
        try {
            account = CloudStorageAccount.parse("DefaultEndpointsProtocol=https;AccountName=leeliublob;AccountKey=O7xxxxxxxxxxxxxxx/x/e9l9FhLqayXcbz1R+E0mIcJ5Wjkly1DsQPYY5dF2JrAVHtBozbJo29ZrrGJA==;EndpointSuffix=core.windows.net");
            CloudBlobClient client = account.createCloudBlobClient();
    
            Iterable<CloudBlobContainer> containers = client.listContainers();
            for (CloudBlobContainer cloudBlobContainer : containers) {
                Iterable<ListBlobItem> blobs = cloudBlobContainer.listBlobs();
                System.out.println("BlobContainer : "+ cloudBlobContainer.getName());
                System.out.println("   blobs inside container '"+cloudBlobContainer.getName()+"' are: ");
                int x=1;
                for (ListBlobItem blobItem : cloudBlobContainer.listBlobs()) {
                    String blobName = blobItem.getUri().toString();
                    System.out.println("         Number "+x+": url="+ blobItem.getUri().toString());
                x++;
                }
    
            }
        } catch (InvalidKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    
    
        }
    
    }
    

    I guess there may be two reasons which cause your errors:

    1. Please ensure that the connection string is correct.

    2. Please ensure to use the latest Java SDK and the SDK of Java which i used from : azure-storage-java