生产环境中可能出现一些问题

  • Bug,尽管我们尽力避免,但它们仍然存在!我们始终努力修复它们,但这正是软件开发中的唯一常数。

  • IO 错误,磁盘和硬件可能会损坏

  • 内存问题,CPU 可能会因其他进程而变得疯狂

对于这种情况,我们在代理服务器中添加了保护机制,以便在出现问题时自动关闭。

这是一个我希望你永远用不到的功能,把它看作是一种保障措施

我们测量以下地方的响应时间:

  • 队列传递(添加到队列中)

  • 日志存储

  • 分页操作

如果响应时间超过配置的超时时间,则代理服务器被认为不稳定,将采取措施关闭代理服务器或停止虚拟机。

你可以使用以下 broker.xml 配置选项来配置临界分析的执行方式。

名称 描述

critical-analyzer

启用或禁用临界分析(默认值为 true)

critical-analyzer-timeout

用于执行临界分析的超时时间(默认值为 120000 毫秒)

critical-analyzer-check-period

用于检查响应时间的间隔(默认值为 critical-analyzer-timeout 的一半)

critical-analyzer-policy

服务器在发生故障时应该记录日志、停止还是关闭(默认值为 LOG

critical-analyzer-policy 的默认值为 LOG,但生成的 broker.xml 会将其设置为 HALT。这是因为如果将 ActiveMQ Artemis 嵌入到应用程序服务器或多租户环境中,我们就无法停止虚拟机。

发行版中的代理服务器将设置为 HALT,但如果你以其他方式使用它,则默认值为 LOG

1. 预期结果

  • 你将看到一些日志

如果你将 critical-analyzer-policy 设置为 HALT

[Artemis Critical Analyzer] 18:10:00,831 ERROR [org.apache.activemq.artemis.core.server] AMQ224079: The process for the virtual machine will be killed, as component org.apache.activemq.artemis.tests.integration.critical.CriticalSimpleTest$2@5af97850 is not responsive

如果你将 critical-analyzer-policy 设置为 SHUTDOWN

[Artemis Critical Analyzer] 18:07:53,475 ERROR [org.apache.activemq.artemis.core.server] AMQ224080: The server process will now be stopped, as component org.apache.activemq.artemis.tests.integration.critical.CriticalSimpleTest$2@5af97850 is not responsive

如果你将 critical-analyzer-policy 设置为 LOG

[Artemis Critical Analyzer] 18:11:52,145 WARN [org.apache.activemq.artemis.core.server] AMQ224081: The component org.apache.activemq.artemis.tests.integration.critical.CriticalSimpleTest$2@5af97850 is not responsive

你将看到服务器的简单线程转储

[Artemis Critical Analyzer] 18:10:00,836 WARN  [org.apache.activemq.artemis.core.server] AMQ222199: Thread dump: AMQ119001: Generating thread dump
*******************************************************************************
===============================================================================
AMQ119002: Thread Thread[Thread-1 (ActiveMQ-scheduled-threads),5,main] name = Thread-1 (ActiveMQ-scheduled-threads) id = 19 group = java.lang.ThreadGroup[name=main,maxpri=10]

sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
===============================================================================


..... blablablablaba ..........


===============================================================================
AMQ119003: End Thread dump
*******************************************************************************
  • 如果配置为 HALT,服务器将被停止

  • 如果使用 SHUTDOWN,系统将被停止。**注意:**如果系统运行不正常,则无法保证停止操作能成功。