У меня есть процесс Java, который подключается к ActiveMQ (как потребитель).Это вызывает проблемы, когда я пытаюсь остановить его полностью.
Процесс останавливается следующим образом:
- Получено управляющее сообщение с просьбой остановить процесс
- Потребители, сеансы и соединения закрыты, ожидая обработки всех уже полученных сообщений
- выводится окончательное сообщение журнала
- Завершение процесса и больше не существует
Процесс, кажется, завершается нормально, если он еще не обработал ни одного сообщения.Но как только сообщение получено, процесс не останавливается, и я не уверен, почему (выводится последнее сообщение журнала)
Я напечатал дамп потока, чтобы посмотреть, что происходит,но я не уверен, что может вызвать проблему:
Attaching to process ID 17264, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09
Deadlock Detection:
No deadlocks found.
Thread 20: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=59 (Compiled frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2 (Compiled frame)
- sun.java2d.Disposer.run() @bci=3 (Interpreted frame)
- java.lang.Thread.run() @bci=11 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 19: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Interpreted frame)
- java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) @bci=20 (Interpreted frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) @bci=78 (Interpreted frame)
- java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=124 (Interpreted frame)
- java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=1 (Interpreted frame)
- java.util.concurrent.ThreadPoolExecutor.getTask() @bci=149 (Interpreted frame)
- java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26 (Interpreted frame)
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5 (Interpreted frame)
- java.lang.Thread.run() @bci=11 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 18: (state = BLOCKED)
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Interpreted frame)
- java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) @bci=20 (Interpreted frame)
- java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) @bci=78 (Interpreted frame)
- java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=124 (Interpreted frame)
- java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=1 (Interpreted frame)
- java.util.concurrent.ThreadPoolExecutor.getTask() @bci=149 (Interpreted frame)
- java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26 (Interpreted frame)
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5 (Interpreted frame)
- java.lang.Thread.run() @bci=11 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 17: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.util.TimerThread.mainLoop() @bci=201 (Interpreted frame)
- java.util.TimerThread.run() @bci=1 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 1: (state = BLOCKED)
Locked ownable synchronizers:
- None
Thread 10: (state = BLOCKED)
Locked ownable synchronizers:
- None
Thread 9: (state = BLOCKED)
Locked ownable synchronizers:
- None
Thread 8: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=59 (Compiled frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2 (Compiled frame)
- java.lang.ref.Finalizer$FinalizerThread.run() @bci=36 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 7: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.Object.wait() @bci=2 (Compiled frame)
- java.lang.ref.Reference.tryHandlePending(boolean) @bci=54 (Compiled frame)
- java.lang.ref.Reference$ReferenceHandler.run() @bci=1 (Interpreted frame)
Locked ownable synchronizers:
- None
Из того, что я вижу,
- Поток 8/20 - это сборщик мусора, ожидающий что-то собрать
- Поток 7 также связан с сборщиком мусора
- Поток 18/19 ???
- Поток 17 является экземпляром Timer, не уверен, кто его запустил
ActiveMQ версия: 5.15.4
ActiveMQConnectionFactory url: failover: (tcp: // localhost: 61616)? Timeout = 3000 & maxReconnectAttempts = 10
Нет других конкретных параметров