3

在我们的 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命令添加参数,我很感兴趣。

4

2 回答 2

3

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

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();
}

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

于 2017-06-16T07:25:54.950 回答
0

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

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

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

于 2022-01-08T07:00:20.120 回答