拦截器
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);
}
}
有关更多详细信息,请参阅 开发插件