Apache ActiveMQ Artemis 的設計允許透過建立外掛程式來新增額外功能。可以同時註冊多個外掛程式,它們將會鏈結在一起,並按照註冊順序執行(即,第一個註冊的外掛程式始終最先執行)。
建立外掛程式非常簡單。它需要:
-
實作
ActiveMQServerPlugin
介面 -
確保外掛程式在類別路徑上
只需要實作您想要新增行為的方法,因為所有介面方法都是預設方法。
1. 註冊外掛程式
若要透過 XML 註冊外掛程式,您需要在 broker.xml
中加入 broker-plugins
元素。也可以使用 property
子元素將配置傳遞給外掛程式。這些屬性(零個到多個)將被讀取並傳遞到外掛程式的 init(Map<String, String>)
操作中,外掛程式實例化後會進行此操作。
<broker-plugins>
<broker-plugin class-name="some.plugin.UserPlugin">
<property key="property1" value="val_1" />
<property key="property2" value="val_2" />
</broker-plugin>
</broker-plugins>
2. 以程式碼方式註冊外掛程式
若要以程式碼方式註冊外掛程式,您需要呼叫 registerBrokerPlugin()
方法,並傳入外掛程式的新實例。在下面的範例中,假設您的外掛程式名為 UserPlugin
,註冊它如下所示:
...
Configuration config = new ConfigurationImpl();
...
config.registerBrokerPlugin(new UserPlugin());
3. 使用 LoggingActiveMQServerPlugin
LoggingActiveMQServerPlugin
會記錄特定的代理程式事件。
您可以透過將以下配置屬性設定為 true
來選擇要記錄哪些事件。
屬性 | 觸發事件 | 預設值 |
---|---|---|
|
連線已建立/銷毀。 |
|
|
工作階段已建立/關閉。 |
|
|
消費者已建立/關閉 |
|
|
訊息已傳遞給消費者,以及當消費者確認訊息時。 |
|
|
當訊息已傳送至位址時,以及當訊息已在代理程式內路由時。 |
|
|
當佇列已建立/銷毀時、當訊息已過期時、當橋接器已部署時以及當發生嚴重錯誤時。 |
|
|
包含以上所有事件。 |
|
預設情況下,LoggingActiveMQServerPlugin
不會記錄任何資訊。透過將上述配置屬性之一(或選定的屬性)設定為 true
來啟動記錄。
若要配置外掛程式,您可以將以下配置加入到代理程式中。在下面的範例中,代理程式將記錄 LOG_DELIVERING_EVENTS
和 LOG_SENDING_EVENTS
。
<broker-plugins>
<broker-plugin class-name="org.apache.activemq.artemis.core.server.plugin.impl.LoggingActiveMQServerPlugin">
<property key="LOG_DELIVERING_EVENTS" value="true" />
<property key="LOG_SENDING_EVENTS" value="true" />
</broker-plugin>
</broker-plugins>
LoggingActiveMQServerPlugin
中的大多數事件都遵循 beforeX
和 afterX
通知模式(例如 beforeCreateConsumer()
和 afterCreateConsumer()
)。
在記錄層級 INFO
中,當發生 afterX
通知時,LoggingActiveMQServerPlugin 會記錄一個條目。透過將記錄器 org.apache.activemq.artemis.core.server.plugin.impl
設定為 DEBUG
,會為 beforeX
和 afterX
通知產生記錄條目。記錄層級 DEBUG
也會為可用的通知記錄更多資訊。
4. 使用 NotificationActiveMQServerPlugin
可以配置 NotificationActiveMQServerPlugin,以便針對特定代理程式事件傳送額外的通知。
您可以透過將以下配置屬性設定為 true
來選擇要傳送哪些通知。
屬性 | 屬性 描述 | 預設值 |
---|---|---|
|
當建立/銷毀連線時傳送通知。 |
|
|
當建立/關閉工作階段時傳送通知。 |
|
|
當新增/移除位址時傳送通知。 |
|
|
當訊息傳遞給消費者時傳送通知。 |
|
|
當訊息被代理程式過期時傳送通知。 |
|
預設情況下,NotificationActiveMQServerPlugin 不會傳送任何通知。透過將上述配置屬性之一(或選定的屬性)設定為 true
來啟動外掛程式。
若要配置外掛程式,您可以將以下配置加入到代理程式中。在下面的範例中,代理程式將傳送 SEND_CONNECTION_NOTIFICATIONS
和 SEND_SESSION_NOTIFICATIONS
。
<broker-plugins>
<broker-plugin class-name="org.apache.activemq.artemis.core.server.plugin.impl.NotificationActiveMQServerPlugin">
<property key="SEND_CONNECTION_NOTIFICATIONS" value="true" />
<property key="SEND_SESSION_NOTIFICATIONS" value="true" />
</broker-plugin>
</broker-plugins>
5. 使用 BrokerMessageAuthorizationPlugin
BrokerMessageAuthorizationPlugin
會根據消費者是否具有與訊息屬性中指定的值相符的角色來篩選傳送給消費者的訊息。
您可以透過設定以下配置來選擇哪個屬性將用於指定使用訊息所需的角色。
屬性 | 屬性 描述 | 預設值 |
---|---|---|
|
用於確定使用訊息所需角色的屬性名稱。 |
|
如果訊息沒有與配置的 ROLE_PROPERTY
相符的屬性,則該訊息將傳送給任何消費者。
若要配置外掛程式,您可以將以下配置加入到代理程式中。在下面的範例中,ROLE_PROPERTY
設定為 permissions
,當該屬性存在時,訊息將僅傳送給具有與其值相符的角色的消費者。
<broker-plugins>
<broker-plugin class-name="org.apache.activemq.artemis.core.server.plugin.impl.BrokerMessageAuthorizationPlugin">
<property key="ROLE_PROPERTY" value="permissions" />
</broker-plugin>
</broker-plugins>
6. 使用 ConnectionPeriodicExpiryPlugin
ConnectionPeriodicExpiryPlugin
將針對在符合的接受器基礎上存活超過 periodSeconds
的連線實作全域到期(和中斷連線)。
當必須定期強制執行憑證輪換或憑證驗證時,此外掛程式會很有用,因為重新連線時會強制執行驗證。
外掛程式需要配置 acceptorMatchRegex
以確定要監視的接受器。通常會將用戶端接受器和聯合或叢集接受器分開,以便只有用戶端連線會受到定期到期的約束。必須配置 acceptorMatchRegex
以比對接受器的名稱,這些接受器的連線將受到定期到期的約束。
屬性 | 屬性 描述 | 預設值 |
---|---|---|
|
用於比對要監視的接受器名稱的正規表示式 |
|
|
連線可以持續的最長期限,以秒為單位 |
900 秒(15 分鐘) |
|
確定我們檢查連線到期的頻率,並提供我們用來排程中斷連線的隨機秒數的上限。使用隨機秒數可能會避免在完全相同的時間發生多次重新連線。它必須是正值 > 0 |
30 秒 |
外掛程式可以透過正常的 broker-plugin 方式在 xml 中配置
<broker-plugins>
<broker-plugin class-name="org.apache.activemq.artemis.core.server.plugin.impl.ConnectionPeriodicExpiryPlugin">
<property key="acceptorMatchRegex" value="netty-client-acceptor" />
</broker-plugin>
</broker-plugins>