在生產環境中可能會發生一些問題
-
錯誤 (Bug),無論我們多麼努力,它們仍然會發生!我們總是試圖修正它們,但這是軟體開發中唯一不變的事情。
-
IO 錯誤,磁碟和硬體可能會損壞
-
記憶體問題,CPU 可能會被其他進程佔用而異常
對於這種情況,我們為代理程式新增了一項保護機制,當發生糟糕的事情時,它會自行關閉。
我希望您不需要使用此功能,請將其視為一種安全措施
我們會測量在以下位置的時間響應:
-
佇列傳遞 (新增至佇列)
-
日誌儲存
-
分頁操作
如果響應時間超過設定的逾時時間,則會認為代理程式不穩定,並將採取行動來關閉代理程式或停止虛擬機器。
您可以使用 broker.xml 中的以下配置選項來設定如何執行重大分析。
名稱 | 描述 |
---|---|
critical-analyzer |
啟用或停用重大分析 (預設為 true) |
critical-analyzer-timeout |
用於執行重大分析的逾時時間 (預設為 120000 毫秒) |
critical-analyzer-check-period |
用於檢查響應時間的時間 (預設為 critical-analyzer-timeout 的一半) |
critical-analyzer-policy |
發生失敗時,伺服器應該記錄日誌、停止運作或關閉 (預設為 |
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
,系統將會停止。注意:如果系統運作不正常,則不保證停止能夠生效。