ActiveMQ Classic InactivityMonitor
使用 ActiveMQ Classic > 設定傳輸 > ActiveMQ Classic InactivityMonitor
ActiveMQ Classic InactivityMonitor
ActiveMQ Classic InactivityMonitor 是一個活動執行緒,會檢查連線是否仍然有效,並且如果懷疑連線運作不正常,則會關閉連線。
連線監控方式為:
- 確保在指定時間段(最大非活動時間)內從連線讀取資料。
- 如果在指定時間段內沒有透過連線傳送正常的 activemq 流量,則向連線寫入一個
KeepAliveInfo
訊息。
每個連線都有兩個關聯的 InactivityMonitor,連線的每一端各有一個。 InactivityMonitor 期望在指定的時間段內收到連線上的資料。如果在此期間沒有透過連線傳送正常的 ActiveMQ Classic 流量,它期望收到連線另一端的 InactivityMonitor 發送的 KeepAliveInfo
訊息。
使用預設值;如果連線在 30 秒內沒有寫入或讀取任何資料,則 InactivityMonitor 會啟動。InactivityMonitor 會拋出一個 InactivityIOException
並關閉與連線相關聯的傳輸。這會導致以下 DEBUG
記錄:
2012-06-26 17:13:55,712 | DEBUG | 30000 ms elapsed since last read check. | org.apache.activemq.transport.AbstractInactivityMonitor | InactivityMonitor ReadCheck
2012-06-26 17:13:55,712 | DEBUG | No message received since last read check for tcp:///127.0.0.1:52659! Throwing InactivityIOException. | org.apache.activemq.transport.AbstractInactivityMonitor | InactivityMonitor ReadCheck
2012-06-26 17:13:55,714 | DEBUG | Transport Connection to: tcp://127.0.0.1:52659 failed:
org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: tcp://127.0.0.1:52659 |
org.apache.activemq.broker.TransportConnection.Transport | InactivityMonitor Async Task:
java.util.concurrent.ThreadPoolExecutor$Worker@6a346239
org.apache.activemq.transport.InactivityIOException: Channel was inactive for too (>30000) long: tcp://127.0.0.1:52659
at org.apache.activemq.transport.AbstractInactivityMonitor$4.run(AbstractInactivityMonitor.java:187)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
進階 InactivityMonitor 設定
有一些設定選項可以進一步微調 InactivityMonitor
。 請注意,對於大多數使用情況,預設值就已經足夠。
參數 | 預設值 | 描述 |
---|---|---|
wireFormat.maxInactivityDuration |
30000 |
逾時時間,以毫秒為單位,如果在指定時間內沒有收到任何資料,則代理程式會關閉連線。 |
wireFormat.maxInactivityDurationInitalDelay |
10000 |
指定開始監控連線非活動狀態之前的最大延遲時間,以毫秒為單位。 如果代理程式正在同時建立多個連線的負載下,這可能會很有用。 |
transport.useInactivityMonitor |
true |
值為 false 會完全停用 InactivityMonitor ,並且連線永遠不會逾時。 |
transport.useKeepAlive |
true |
決定是否應在閒置連線上傳送 KeepAliveInfo 訊息,以防止連線逾時。 停用保持連線機制仍會在指定的時間內未在連線上收到任何資料時導致連線逾時。 |
這些參數可以直接在客戶端連線 URL 上指定,例如 tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=30000
,** 或在代理程式的傳輸連接器 URL 上指定
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?wireFormat.maxInactivityDuration=30000&wireFormat.maxInactivityDurationInitalDelay=10000"/>
</transportConnectors>
如果在同一連線的兩端將 maxInactivityDuration
和 maxInactivityDurationInitalDelay
設定為不同的值,會發生什麼情況?
在啟動時,InactivityMonitor 會協商適當的 maxInactivityDuration
和 maxInactivityDurationInitalDelay
。連線會採用較短的時間。
可以停用連線上的 InactivityMonitor 嗎?
設定 transport.useInactivityMonitor=false
將會停用 InactivityMonitor。 設定 wireFormat.maxInactivityDuration=0
將會達到相同的結果。