Apache ActiveMQ Artemis 的設計允許透過建立外掛程式來新增額外功能。可以同時註冊多個外掛程式,它們將會鏈結在一起,並按照註冊順序執行(即,第一個註冊的外掛程式始終最先執行)。

建立外掛程式非常簡單。它需要:

只需要實作您想要新增行為的方法,因為所有介面方法都是預設方法。

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 來選擇要記錄哪些事件。

屬性 觸發事件 預設值

LOG_CONNECTION_EVENTS

連線已建立/銷毀。

false

LOG_SESSION_EVENTS

工作階段已建立/關閉。

false

LOG_CONSUMER_EVENTS

消費者已建立/關閉

false

LOG_DELIVERING_EVENTS

訊息已傳遞給消費者,以及當消費者確認訊息時。

false

LOG_SENDING_EVENTS

當訊息已傳送至位址時,以及當訊息已在代理程式內路由時。

false

LOG_INTERNAL_EVENTS

當佇列已建立/銷毀時、當訊息已過期時、當橋接器已部署時以及當發生嚴重錯誤時。

false

LOG_ALL_EVENTS

包含以上所有事件。

false

預設情況下,LoggingActiveMQServerPlugin 不會記錄任何資訊。透過將上述配置屬性之一(或選定的屬性)設定為 true 來啟動記錄。

若要配置外掛程式,您可以將以下配置加入到代理程式中。在下面的範例中,代理程式將記錄 LOG_DELIVERING_EVENTSLOG_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 中的大多數事件都遵循 beforeXafterX 通知模式(例如 beforeCreateConsumer()afterCreateConsumer())。

在記錄層級 INFO 中,當發生 afterX 通知時,LoggingActiveMQServerPlugin 會記錄一個條目。透過將記錄器 org.apache.activemq.artemis.core.server.plugin.impl 設定為 DEBUG,會為 beforeXafterX 通知產生記錄條目。記錄層級 DEBUG 也會為可用的通知記錄更多資訊。

4. 使用 NotificationActiveMQServerPlugin

可以配置 NotificationActiveMQServerPlugin,以便針對特定代理程式事件傳送額外的通知。

您可以透過將以下配置屬性設定為 true 來選擇要傳送哪些通知。

屬性 屬性 描述 預設值

SEND_CONNECTION_NOTIFICATIONS

當建立/銷毀連線時傳送通知。

false

SEND_SESSION_NOTIFICATIONS

當建立/關閉工作階段時傳送通知。

false

SEND_ADDRESS_NOTIFICATIONS

當新增/移除位址時傳送通知。

false

SEND_DELIVERED_NOTIFICATIONS

當訊息傳遞給消費者時傳送通知。

false

SEND_EXPIRED_NOTIFICATIONS

當訊息被代理程式過期時傳送通知。

false

預設情況下,NotificationActiveMQServerPlugin 不會傳送任何通知。透過將上述配置屬性之一(或選定的屬性)設定為 true 來啟動外掛程式。

若要配置外掛程式,您可以將以下配置加入到代理程式中。在下面的範例中,代理程式將傳送 SEND_CONNECTION_NOTIFICATIONSSEND_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

用於確定使用訊息所需角色的屬性名稱。

requiredRole.

如果訊息沒有與配置的 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 以比對接受器的名稱,這些接受器的連線將受到定期到期的約束。

屬性 屬性 描述 預設值

acceptorMatchRegex

用於比對要監視的接受器名稱的正規表示式

periodSeconds

連線可以持續的最長期限,以秒為單位

900 秒(15 分鐘)

accuracyWindowSeconds

確定我們檢查連線到期的頻率,並提供我們用來排程中斷連線的隨機秒數的上限。使用隨機秒數可能會避免在完全相同的時間發生多次重新連線。它必須是正值 > 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>