Загрузка файла в контейнер BLOB-объектов приводит к утечке каналов - PullRequest
0 голосов
/ 17 июня 2019

Я новичок в Azure, и я использую azure-storage-blob v11.0.0 для Java и пытаюсь загрузить файл, следуя примеру здесь https://github.com/Azure-Samples/storage-blob-java-getting-started

Это загрузка, как и ожидалось, ноЕсли мое приложение остается активным, кажется, что время ожидания удаленного сокета приведет к генерации и исключению:

18:16:46.528 23751 [nioEventLoopGroup-1-1] INFO  com.microsoft.azure.storage.blob.LoggingFactory$LoggingPolicy - Successfully Received Response
Request try:'1', request duration:'1271' ms, operation duration:'1271' ms
PUT: https://REDACTED.blob.core.windows.net/REDACTED/REDACTED.wav
Authorization: REDACTED
Content-Length: 275244
x-ms-version: 2018-11-09
x-ms-date: Mon, 17 Jun 2019 16:16:45 GMT
host: REDACTED.blob.core.windows.net
Content-Type: application/octet-stream
connection: keep-alive
x-ms-client-request-id: c78bf188-f604-40da-b5a9-340eaad045bd
x-ms-blob-type: BlockBlob
User-Agent:  Azure-Storage/11.0.0 (JavaJRE 1.8.0_212; Linux 4.19.49-1-MANJARO)

18:16:46.540 23763 [nioEventLoopGroup-1-1] DEBUG AzureCopy - Completed upload request. : 201
18:16:46.541 23764 [nioEventLoopGroup-1-1] DEBUG com.microsoft.rest.v2.http.SharedChannelPool - Channel released to pool: 77156491
18:19:48.496 205719 [nioEventLoopGroup-1-2] WARN  com.microsoft.rest.v2.http.NettyClient$AcquisitionListener - Error emitted on channel 8afa7171. Message: Connexion ré-initialisée par le correspondant
18:19:48.500 205723 [nioEventLoopGroup-1-2] DEBUG com.microsoft.rest.v2.http.NettyClient$AcquisitionListener - Stack trace: 
java.lang.Exception: null
    at com.microsoft.rest.v2.http.NettyClient$AcquisitionListener.emitError(NettyClient.java:427)
    at com.microsoft.rest.v2.http.NettyClient$HttpClientInboundHandler.exceptionCaught(NettyClient.java:890)
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:297)
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:276)
    at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:268)
    at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireExceptionCaught(CombinedChannelDuplexHandler.java:426)
    at io.netty.channel.ChannelHandlerAdapter.exceptionCaught(ChannelHandlerAdapter.java:92)
    at io.netty.channel.CombinedChannelDuplexHandler$1.fireExceptionCaught(CombinedChannelDuplexHandler.java:147)
    at io.netty.channel.ChannelInboundHandlerAdapter.exceptionCaught(ChannelInboundHandlerAdapter.java:143)
    at io.netty.channel.CombinedChannelDuplexHandler.exceptionCaught(CombinedChannelDuplexHandler.java:233)
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:297)
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:276)
    at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:268)
    at io.netty.handler.ssl.SslHandler.exceptionCaught(SslHandler.java:1098)
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:297)
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:276)
    at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:268)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.exceptionCaught(DefaultChannelPipeline.java:1375)
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:297)
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:276)
    at io.netty.channel.DefaultChannelPipeline.fireExceptionCaught(DefaultChannelPipeline.java:918)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.handleReadException(AbstractNioByteChannel.java:125)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:174)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:682)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:617)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:534)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:748)
18:19:48.501 205724 [nioEventLoopGroup-1-2] INFO  com.microsoft.rest.v2.http.SharedChannelPool - ---- com.microsoft.rest.v2.http.SharedChannelPool@fbece82: size 768, keep alive (sec) 60 ----
18:19:48.502 205725 [nioEventLoopGroup-1-2] INFO  com.microsoft.rest.v2.http.SharedChannelPool - Channel    State   For Age URL
18:19:48.504 205727 [nioEventLoopGroup-1-2] INFO  com.microsoft.rest.v2.http.SharedChannelPool - 77156491   AVAIL   181s    182s    https://REDACTED.blob.core.windows.net:443
18:19:48.504 205727 [nioEventLoopGroup-1-2] INFO  com.microsoft.rest.v2.http.SharedChannelPool - 8afa7171   AVAIL   182s    182s    https://REDACTED.blob.core.windows.net:443

Я все еще могу использовать приложение и выполнить другую загрузку, но я не совсем уверен,Я должен очистить любое неиспользуемое соединение чего-либо.Или, если я могу игнорировать эти ошибки.

Редактировать: добавлен пример кода

public class AzureCopy
{
    private final ContainerURL containerURL;

    public AzureCopy() throws InvalidKeyException, MalformedURLException
    {
        final String accountName = ConfHelper.getString("AZURE_ACCOUNT");
        final String accountKey = ConfHelper.getString("AZURE_KEY");

        final SharedKeyCredentials creds = new SharedKeyCredentials(accountName, accountKey);

        final ServiceURL serviceURL = new ServiceURL(new URL("https://" + accountName + ".blob.core.windows.net"), StorageURL.createPipeline(creds, new PipelineOptions()));

        containerURL = serviceURL.createContainerURL(ConfHelper.getString("AZURE_CONTAINER"));
    }

    public void upload(final File toUpload)
    {
        if(toUpload != null)
        {
            final BlockBlobURL blobURL = containerURL.createBlockBlobURL(toUpload.getName());

            try
            {
                uploadFile(blobURL, toUpload);
            }
            catch(final IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    private static void uploadFile(final BlockBlobURL blob, final File sourceFile) throws IOException
    {
        final AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(sourceFile.toPath());

        TransferManager.uploadFileToBlockBlob(fileChannel, blob, 8 * 1024 * 1024, null, null).subscribe(response -> System.out.println("Completed upload request. : " + response.response().statusCode()));
    }
}

Как вы можете видеть, это в основном пример кода, который доступен на github без интерактивного меню.Этот класс создается в начале приложения, и метод загрузки вызывается, когда нам нужно загрузить файл.Ничего более.Мы не создаем новый экземпляр каждый раз, мы повторно используем тот же экземпляр, когда это необходимо.

...