- Остановка докера отправляет SIGTERM для обработки идентификатора 1 в контейнере.
- Идентификатор процесса 1 в контейнере — это Java-процесс, запускающий tomcat.*)
- Да, сам tomcat корректно завершает работу, но не сервлеты. >
- Сервлеты уничтожаются после 2 секунд, даже если они находятся в процессе обработки запроса(!!)
Хотя наша точка входа в контейнер [ "/opt/tomcat/bin/catalina.sh", "run" ], но
в catalina.sh Java-процесс запускается с помощью команды bash buildin "exec",
и, следовательно, Java процесс заменяет процесс оболочки и таким образом становится новым идентификатором процесса 1.
(Я могу проверить это с помощью exec в работающем контейнере и выполнить там «ps aux».)
Кстати, я использую tomcat 7.0.88.< /p>
Я нашел утверждения о том, что Tomcat по умолчанию выполняет корректное завершение работы. (http://tomcat.10.x6.nabble.com/Graceful ... 20523.html - «любые текущие соединения будут завершены»), но все, что я вижу, это то, что SIGTERM, который отправляется из докера в Java-процесс практически не останавливает текущее выполнение запроса.
Я написал небольшой сервлет для проверки этого поведения:
Код: Выделить всё
import javax.ws.rs.*;
import javax.ws.rs.core.*;
import javax.ws.rs.core.Response.Status;
@Path("/")
public class SlowServerRes
{
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("test1")
public Response test1(@QueryParam("sleep") final int sleepDurationSec)
{
long received = System.currentTimeMillis();
System.out.println("+++++++++++++++++++++ received request at " + received);
for (int i=1; i SIGTERM), просто чтобы сохранить нагрузка сбалансированный.)
Подробнее здесь: [url]https://stackoverflow.com/questions/51675180/how-to-gracefully-shutdown-servelts-in-tomcat-in-docker-container[/url]
Мобильная версия