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 秒

该插件可以通过 xml 在正常的 broker-plugin 方式中进行配置

<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>