序
本文主要研究一下artemis的BaseInterceptor
BaseInterceptor
activemq-artemis-master/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/BaseInterceptor.java
public interface BaseInterceptor<P> {
/**
* Intercepts a packet which is received before it is sent to the channel
*
* @param packet the packet being received
* @param connection the connection the packet was received on
* @return {@code true} to process the next interceptor and handle the packet,
* {@code false} to abort processing of the packet
* @throws ActiveMQException
*/
boolean intercept(P packet, RemotingConnection connection) throws ActiveMQException;
}
- BaseInterceptor定义了intercept方法,该方法返回true表示可以继续下一个interceptor,返回false表示终止packet的处理
AbstractProtocolManager
activemq-artemis-master/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/AbstractProtocolManager.java
public abstract class AbstractProtocolManager<P, I extends BaseInterceptor<P>, C extends RemotingConnection> implements ProtocolManager<I> {
private final Map<SimpleString, RoutingType> prefixes = new HashMap<>();
protected void invokeInterceptors(final List<I> interceptors, final P message, final C connection) {
if (interceptors != null && !interceptors.isEmpty()) {
for (I interceptor : interceptors) {
try {
if (!interceptor.intercept(message, connection)) {
break;
}
} catch (Exception e) {
ActiveMQServerLogger.LOGGER.failedToInvokeAninterceptor(e);
}
}
}
}
@Override
public void setAnycastPrefix(String anycastPrefix) {
for (String prefix : anycastPrefix.split(",")) {
prefixes.put(SimpleString.toSimpleString(prefix), RoutingType.ANYCAST);
}
}
@Override
public void setMulticastPrefix(String multicastPrefix) {
for (String prefix : multicastPrefix.split(",")) {
prefixes.put(SimpleString.toSimpleString(prefix), RoutingType.MULTICAST);
}
}
@Override
public Map<SimpleString, RoutingType> getPrefixes() {
return prefixes;
}
}
- AbstractProtocolManager的invokeInterceptors方法接收interceptors,之后挨个遍历interceptors,执行interceptor.intercept(message, connection),若返回false则立马终止循环
小结
BaseInterceptor定义了intercept方法,该方法返回true表示可以继续下一个interceptor,返回false表示终止packet的处理
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。