ActiveMQ - процесс Java остается живым, когда я хочу остановить его - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть процесс 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

Нет других конкретных параметров

...