本文主要研究一下artemis的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; }
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; } }
BaseInterceptor定义了intercept方法,该方法返回true表示可以继续下一个interceptor,返回false表示终止packet的处理