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 秒 |
该插件可以通过 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>