拦截器

功能 > 拦截器

ActiveMQ Classic 具有一个复杂的拦截器堆栈,因此您可以将所需的任何功能轻松地附加到代理中,而不会使其他所有代理代码复杂化。这确实帮助我们保持代码干净且模块化,同时提供强大的扩展点。

有关使用拦截器可以执行的各种操作示例,请参阅以下页面。

插件的工作原理

插件是接口 BrokerPlugin 的一个实例,它允许插件将自身添加到代理拦截器链中,通常使用 BrokerFilter 作为基类,以允许仅自定义某些操作。

实现 BrokerPlugin 接口的对象在消息代理的 XML 配置文件中称为插件(请参见下面的示例)。您的插件然后可以选择引用 XML 文件中定义的其他 bean。

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.org/config/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://activemq.org/config/1.0 
https://activemq.apache.org/schema/activemq-core.xsd https://activemq.apache.org/camel/schema/spring  https://activemq.apache.org/camel/schema/spring/camel-spring.xsd">

<!-- Allows us to use system properties as variables in this configuration file -->
<bean  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />

  <broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" dataDirectory="${activemq.base}/data" plugins="#myPlugin">

    <!-- The transport connectors ActiveMQ Classic will listen to -->
    <transportConnectors>
      <transportConnector name="openwire" uri="tcp://127.0.0.1:61616" />
    </transportConnectors>

  </broker>

  <bean id="myPlugin" class="org.myorg.MyPlugin">
    <!-- You can reference one or more Spring beans in this file -->
    <property name="myMgr" ref="myManager"/>		 
  </bean>

  <bean id="myManager" class="org.myorg.MyManager">
    <property name="fooList">
      <list>
        <value>foo</value>
        <value>foo2</value>
      </list>
    </property>
  </bean>

</beans>

您还可以从元素中定义插件,如以下示例所示。

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.org/config/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://activemq.org/config/1.0 
https://activemq.apache.org/schema/activemq-core.xsd https://activemq.apache.org/camel/schema/spring
https://activemq.apache.org/camel/schema/spring/camel-spring.xsd">

 <!-- Allows us to use system properties as variables in this configuration file -->
 <bean  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />

 <broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" dataDirectory="${activemq.base}/data">

  <!-- The transport connectors ActiveMQ Classic will listen to -->
  <transportConnectors>
     <transportConnector name="openwire" uri="tcp://127.0.0.1:61616" />
  </transportConnectors>

  <plugins>
      <bean xmlns="http://www.springframework.org/schema/beans" id="myPlugin" class="org.myorg.MyPlugin"/>    
  </plugins>

 </broker>
 
</beans>

在启动时,主代理或核心代理将调用您的插件的 installPlugin() 方法。此方法创建并返回一个通常扩展 BrokerFilter 的对象。

import org.apache.activemq.broker.Broker;
import org.apache.activemq.broker.BrokerPlugin;

public class MyPlugin implements BrokerPlugin {	
        
        public Broker installPlugin(Broker broker) throws Exception {            
             return new MyBroker(broker);
        }	

}

BrokerFilter 类是一个便利类,它实现了 Broker 接口。此接口定义了您的实现可以拦截的所有主要操作(例如,addConnection、addSession 等)。扩展 BrokerFilter 的类覆盖了 Broker 接口中定义的任何方法,以便它可以拦截相应的核心引擎的操作。以下是一个扩展 BrokerFilter 并拦截/覆盖 addConnection() 和 addSession() Broker 方法/操作的类的示例。

import org.apache.activemq.broker.Broker;
import org.apache.activemq.broker.BrokerFilter;
import org.apache.activemq.broker.ConnectionContext;
import org.apache.activemq.command.ConnectionInfo;

public class MyBroker extends BrokerFilter {
    
     public MyBroker(Broker next) {
        super(next);                
    }

    public void addConnection(ConnectionContext context, ConnectionInfo info) 
            throws Exception {       
        
         // Your code goes here 

        // Then call your parent
        super.addConnection(context, info);
    }   

    public void addSession(ConnectionContext context, SessionInfo info) 
            throws Exception {       
        
         //  Your code goes here...

         // Then call your parent
         super.addSession(context, info);
    }	
}

有关更多详细信息,请参阅 开发插件

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 授权。