Я использую 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()