Фоновый поток для приложения сервлета Tomcat [дубликат]

Если вы настраиваете соединение с БД PostgreSQL на виртуальной машине Azure, вы должны знать, что существуют тайм-ауты для Unbound и Outbound соединений. Согласно https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-outbound-connections#idletimeout , исходящие соединения имеют 4-минутное время простоя. Этот тайм-аут не регулируется. Для входящего времени у вас есть возможность измениться на портале Azure.

Мы столкнулись с подобной проблемой и смогли решить ее на стороне клиента. Мы изменили конфигурацию Hikari по умолчанию при загрузке Spring следующим образом:

hikari:

  • время ожидания соединения: 20000

  • проверка - время ожидания: 20000

  • время простоя: 30000

  • максимальное время жизни: 40000

  • минимальное время простоя: 1
  • максимальный размер пула: 3
  • запрос проверки соединения: SELECT 1
  • connection-init-sql: SELECT 1

60
задан SquareCog 27 April 2009 в 01:32
поделиться

3 ответа

Если вы хотите запустить поток при развертывании WAR, вы можете определить прослушиватель контекста в сети. .xml:

<web-app>
    <listener>
       <listener-class>com.mypackage.MyServletContextListener</listener-class>
    </listener>
</web-app>

Затем реализуйте этот класс примерно так:

public class MyServletContextListener implements ServletContextListener {

    private MyThreadClass myThread = null;

    public void contextInitialized(ServletContextEvent sce) {
        if ((myThread == null) || (!myThread.isAlive())) {
            myThread = new MyThreadClass();
            myThread.start();
        }
    }

    public void contextDestroyed(ServletContextEvent sce){
        try {
            myThread.doShutdown();
            myThread.interrupt();
        } catch (Exception ex) {
        }
    }
}
79
ответ дан 24 November 2019 в 17:48
поделиться

Я ищу способ запуска фонового потока при запуске сервера Tomcat

Я думаю, что вы ищете способ запуска фонового потока, когда ваше веб-приложение запускается Tomcat.

Это можно сделать с помощью ServletContextListener . Он зарегистрирован в web.xml и будет вызываться при запуске или остановке вашего приложения. Затем вы можете создать (а затем и остановить) свой поток, используя обычные способы Java для создания потока (или ExecutionService).

12
ответ дан 24 November 2019 в 17:48
поделиться

Я бы просто немного изменил очень подробный ответ, который дал Крис; Я бы установил myThread как поток демона с помощью myThread.setDaemon (true); , который в основном будет поддерживать поток активным, пока у вас работают другие потоки, не являющиеся демонами, которые нуждаются в вашем фоновая нить вокруг. But that's just my 2 cents.

2
ответ дан 24 November 2019 в 17:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: