TimerThreads, созданные для подключения к базе данных, продолжают работать даже после закрытия контекста пружины с помощью close - PullRequest
0 голосов
/ 31 марта 2020

Я использую Spring версию 5.1.4, Apache commons pool2 версия 2.5.0 (пробовал также с последней версией 2.8.0). Когда мой процесс завершен, я oop через все объекты пула и вызываю метод GenericObjectPool.invalidateObject, который вызывает метод BasePooledObjectFactory.destroyObject (T t).

Код выглядит примерно так:

for (int i = 0; i < numOfPooledObjects; i++)
{
   GenericObjectPool.invalidateObject(GenericObjectPool.borrowObject());
}
GenericObjectPool.close();

Даже после завершения процесса некоторые из TimerThreads продолжают работать, количество потоков похоже на Число объектов, созданных мной в пуле. Есть идеи, что здесь может быть не так?

Я впервые использую библиотеку commons pool2, поэтому, вероятно, не следую предлагаемому способу закрытия / закрытия пула.

Ниже приводится дамп потока для TimerThread из процесса зависания.

"Timer-16" #51 prio=5 os_prio=0 tid=0x00000000206c3000 nid=0xf70 in Object.wait() [0x000000002b19e000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000006d272fd10> (a java.util.TaskQueue)
    at java.util.TimerThread.mainLoop(Timer.java:552)
    - locked <0x00000006d272fd10> (a java.util.TaskQueue)
    at java.util.TimerThread.run(Timer.java:505)

Следующее - из дампа в режиме отладки после выхода из основного метода:

"Timer-14@4884" prio=5 tid=0x34 nid=NA waiting
  java.lang.Thread.State: WAITING
      at java.lang.Object.wait(Object.java:-1)
      at java.util.TimerThread.mainLoop(Timer.java:552)
      at java.util.TimerThread.run(Timer.java:505)

Обновление:

Пул общих ресурсов не вызывает этого, эти TimerThreads создаются Соединение с базой данных, соединения настраиваются весной xml.

Так что похоже, что контекст весны не закрывается должным образом, хотя я использую context.close () в конце программы.

Вот как Я создаю контекст:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

Это способ закрыть контекст.

context.close()

1 Ответ

0 голосов
/ 01 апреля 2020

Вам необходимо зарегистрировать хук отключения в JVM. Отметьте this , чтобы узнать больше об этом.

...