拦截器设计学习,来自flume,基本看代码就懂,这种设计非常普遍
public interface Interceptor { public void initialize(); public Event intercept(Event event); public List<Event> intercept(List<Event> events); public void close(); public interface Builder extends Configurable { public Interceptor build(); } }
public class HostInterceptor implements Interceptor { private static final Logger logger = LoggerFactory .getLogger(HostInterceptor.class); private final boolean preserveExisting; private final String header; private String host = null; private HostInterceptor(boolean preserveExisting, boolean useIP, String header) { this.preserveExisting = preserveExisting; this.header = header; InetAddress addr; try { addr = InetAddress.getLocalHost(); if (useIP) { host = addr.getHostAddress(); } else { host = addr.getCanonicalHostName(); } } catch (UnknownHostException e) { logger.warn("Could not get local host address. Exception follows.", e); } } @Override public void initialize() { // no-op } @Override public Event intercept(Event event) { Map<String, String> headers = event.getHeaders(); if (preserveExisting && headers.containsKey(header)) { return event; } if (host != null) { headers.put(header, host); } return event; } @Override public List<Event> intercept(List<Event> events) { for (Event event : events) { intercept(event); } return events; } @Override public void close() { // no-op } /** * Builder which builds new instances of the HostInterceptor. */ public static class Builder implements Interceptor.Builder { private boolean preserveExisting = PRESERVE_DFLT; private boolean useIP = USE_IP_DFLT; private String header = HOST; @Override public Interceptor build() { return new HostInterceptor(preserveExisting, useIP, header); } @Override public void configure(Context context) { preserveExisting = context.getBoolean(PRESERVE, PRESERVE_DFLT); useIP = context.getBoolean(USE_IP, USE_IP_DFLT); header = context.getString(HOST_HEADER, HOST); } } public static class Constants { public static String HOST = "host"; public static String PRESERVE = "preserveExisting"; public static boolean PRESERVE_DFLT = false; public static String USE_IP = "useIP"; public static boolean USE_IP_DFLT = true; public static String HOST_HEADER = "hostHeader"; } }
public class InterceptorChain implements Interceptor { private List<Interceptor> interceptors; public InterceptorChain() { interceptors = Lists.newLinkedList(); } public void setInterceptors(List<Interceptor> interceptors) { this.interceptors = interceptors; } @Override public Event intercept(Event event) { for (Interceptor interceptor : interceptors) { if (event == null) { return null; } event = interceptor.intercept(event); } return event; } @Override public List<Event> intercept(List<Event> events) { for (Interceptor interceptor : interceptors) { if (events.isEmpty()) { return events; } events = interceptor.intercept(events); Preconditions.checkNotNull(events, "Event list returned null from interceptor %s", interceptor); } return events; } @Override public void initialize() { Iterator<Interceptor> iter = interceptors.iterator(); while (iter.hasNext()) { Interceptor interceptor = iter.next(); interceptor.initialize(); } } @Override public void close() { Iterator<Interceptor> iter = interceptors.iterator(); while (iter.hasNext()) { Interceptor interceptor = iter.next(); interceptor.close(); } } }