Как ждать ResultCallback от DockerClient.waitContainerCmd()?

В нашем проекте J2EE мы выполняем конвертацию видео, вызывая sjourdan / ffmpeg docker из нашего кода Java, полагаясь на 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 полностью завершена?


С другой стороны, если кто-то знает, как добавить --rm Параметр к играемому docker run Команда, использующая Docker-Java, мне интересно.

2 ответа

Хорошо, если кому-то нужно решение, вот что мы реализовали в конце:

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

Кажется, достаточно хороший способ справиться с ожиданием от основного потока.

Сегодня есть встроенное решение:

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

Поток будет заблокирован до тех пор, пока содержание не будет запущено.

Другие вопросы по тегам