【问题标题】:How to wait a ResultCallback from DockerClient.waitContainerCmd()?如何等待来自 DockerClient.waitContainerCmd() 的 ResultCallback?
【发布时间】:2017-11-14 02:40:39
【问题描述】:

在我们的 J2EE 项目中,我们通过从我们的 java 代码中调用 sjourdan/ffmpeg docker 来进行一些视频转换,依赖于 docker-java

现在,它看起来像这样(为简洁起见相当简化):

CreateContainerCmd createCommand = dockerClient.createContainerCmd("sjourdan/ffmpeg")
    .withVolumes(aVolume)
    .withBinds(aBind)
    .withCmd("a lot of options about the conversion itself, codec, ratio, …");
CreateContainerResponse container = createCommand.exec();

dockerClient.startContainerCmd(container.getId()).exec();

// vanilla implementation of ResultCallback
MyResultCallback callback = new MyResultCallback();
dockerClient.waitContainerCmd(container.getId()).exec(callback);

当然,事实是,线程会在此之后继续运行,而无需等待回调被回调。

我们应该如何强制线程等待直到回调被调用,通知我们docker命令完全结束?


另一方面,如果有人知道如何使用 docker-java 将 --rm 参数添加到播放的 docker run 命令中,我很感兴趣。

【问题讨论】:

    标签: java docker ffmpeg docker-java


    【解决方案1】:

    好吧,如果有人需要解决方案,这里是我们最后实现的:

    CountDownLatch latch = new CountDownLatch(1);
    MyResultCallback callback = new MyResultCallback(latch);
    dockerClient.waitContainerCmd(container.getId()).exec(callback);
    return latch.await(5, TimeUnits.MINUTES);
    

    MyResultCallback.onComplete 看起来像

    public void onComplete()
    {
        latch.countDown();
    }
    

    似乎是一种很好的方式来处理来自主线程的等待。

    【讨论】:

      【解决方案2】:

      今天有一个内置的解决方案:

      var callback = new WaitContainerResultCallback();
      docker.waitContainerCmd(container.getId()).exec(callback);
      callback.awaitStarted();
      

      线程将被阻塞,直到容器启动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-23
        • 2020-03-13
        • 1970-01-01
        • 1970-01-01
        • 2022-08-23
        • 1970-01-01
        • 1970-01-01
        • 2019-10-12
        相关资源
        最近更新 更多