在生產環境中可能會發生一些問題

  • 錯誤 (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,系統將會停止。注意:如果系統運作不正常,則不保證停止能夠生效。