Как ждать 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();
Поток будет заблокирован до тех пор, пока содержание не будет запущено.