3.3. 通过截获数据包进行审核消息
截获数据包进入或退出代理,以审核数据包或过滤信息。拦截器会更改其截获的数据包。这使得拦截器功能强大,但也会出现危险性。
开发拦截器以满足您的业务需求。拦截器是特定于协议的,必须实现适当的接口。
拦截器必须实现 intercept()
方法,该方法返回布尔值。如果值为 true
,则消息数据包将继续返回。如果为 false
,则进程中止,不会调用其他拦截器,且不会进一步处理消息数据包。
3.3.1. 创建拦截器 复制链接链接已复制到粘贴板!
拦截器可能会更改其被截获的数据包。您可以创建自己的传入和传出拦截器。所有拦截器都是特定的协议,为分别进入或退出服务器的任何数据包调用。这可让您创建拦截器来满足商业要求,如审核数据包。
拦截器及其依赖项必须放在代理的 Java 类路径中。您可以使用 < ;broker_instance_dir> /lib
目录,因为它是 classpath 的一部分。
以下示例演示了如何创建检查传递给它的每个数据包的拦截器。
示例为每个协议实施特定的接口。
流程
实施适当的接口并覆盖其
intercept()
方法。如果您使用 AMQP 协议,请实施
org.apache.activemq.artemis.protocol.amqp.broker.AmqpInterceptor
接口。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用的是内核协议,您的拦截器必须实施
org.apache.artemis.activemq.api.core.Interceptor
接口。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用 IFL 协议,实施
org.apache.activemq.artemis.core.protocol.mqtt.awxInterceptor
接口。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用 STOMP 协议,请实施
org.apache.activemq.artemis.core.protocol.stomp.StompeInterceptor
接口。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3.2. 配置代理以使用拦截器 复制链接链接已复制到粘贴板!
先决条件
-
创建拦截器类,并将其添加到代理的 Java 类路径中(及其依赖项)。您可以使用 <
;broker_instance_dir> /lib
目录,因为它是 classpath 的一部分。
流程
-
Open
<broker_instance_dir>/etc/broker.xml
通过将配置添加到 <broker
_instance_dir> /etc/broker.xml
,将代理配置为使用拦截器如果拦截器用于传入信息,请将其
class-name
添加到remoting-incoming-interceptors
列表中。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果拦截器用于传出消息,请将其
class-name
添加到remoting-outgoing-interceptors
列表中。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3.3. 客户端上的拦截器 复制链接链接已复制到粘贴板!
客户端可以使用拦截器来截获客户端发送到服务器或服务器到客户端的数据包。如果代理拦截器返回 false
值,则不会调用其他拦截器,客户端不会进一步处理数据包。除非以 阻塞
方式发送传出数据包,否则此进程会透明地发生。在本例中,ActiveMQException
会抛出给调用者。引发 ActiveMQException
包含返回 false
值的拦截器的名称。
在服务器中,客户端拦截器类及其依赖项必须添加到客户端的 Java 类路径中,才能正确实例化和调用。