java - ActiveMQ - 当我想停止 Java 进程时它保持活动状态
问题描述
我有一个连接到 ActiveMQ(作为消费者)的 java 进程。当我试图干净地停止它时,它会导致问题。
该过程停止如下:
- 收到控制消息,要求进程停止
- 消费者、会话和连接关闭,等待所有已收到的消息被处理
- 打印最终日志消息
- 进程关闭&不再存在
如果它还没有处理任何消息,该过程似乎可以正常关闭。但是一旦收到一条消息,该过程就不会停止,我不确定为什么(打印最终的日志消息)
我已经打印了一个线程转储来查看发生了什么,但我不确定是什么导致了这个问题:
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:故障转移:(tcp://localhost:61616)?timeout=3000&maxReconnectAttempts=10
无其他具体参数
解决方案
推荐阅读
- git - 从未合并的文件的 git 日志
- c - C字节序和字节数组
- python - 烧瓶运行给我 ModuleNotFoundError
- amazon-web-services - 如何将 S3 存储桶中的文件添加到 AWS CodePipeline 中的输出工件?(NodeJS)
- minecraft - 使用 Spigot 更改盔甲属性
- c# - 事件处理程序通用 C#
- linux - Linux NASM - 隐藏终端输入
- javascript - 如何延迟加载用户脚本的新选项卡?
- nginx - 如何根据 nginx 中的“Content-Length”标头删除额外数据
- drupal - 为什么 Drupal 不能创建临时文件?