1. 承上启下

之前我们是介绍了sink模块。sink模块中主要负责解析结果的过滤分发和归并操作。但是在上次我们的源码分析中发现canal sink包中不包含过滤相关的实现。过滤相关的实现则全部被放到了一个单独的filter包当中。首先我们先来看看sink模块中是在什么时候用到filter的。

在之前的分析中我们知道sink的实现类是sink包下的EntryEventSink类,其中包含sinkData方法。如下图所示,在sinkData方法中主要就已经为按成了sink组件的主要功能,即filter和sink。

根据源码可知,在做sink前,需要先进行过滤,过滤成功则认为该解析结果是需要被过滤的,即need为true。如果是不需要过滤的数据,则need为false。
至此我们已经知道filter和sink的关系了

2. filter源码解析

2.1 基本结构和基本介绍

基本结构如下图所示

在配置instance.properties的时候都可以设置一些正则表达式来对解析的表进行过滤。filter中就有对正则以及其他表达式的过滤。

2.2 aviater包

下面的类主要是分别对表达式(AviaterELFilter)、正则表名(AviaterRegexFilter)进行过滤。

之所以包名取这个是因为用到了google的一个Java表达式引擎工具aviator来负责对表达式进行解析。

此外作者还用了Jakarta-ORO正则表达式库。这里还有点问题没有搞懂,就是为什么不使用JAVA自带的正则库,后续再看看。现在猜测可能是因为和perl正则配合的好吧。关于jakarta-ORO的使用可以参考jakarta使用jakarta使用2

3. 总结

该模块总体上思路还是比较简单的。实现细节若有需要可以再仔细看看。