Flink TableFactory类加载bug

问题:使用fatjar时,当更新了fatjar中的TableFactory相关的代码时,重新上传fatjar后无法使用最新的代码
解析
TableFactory相关的类是通过Java SPI的机制加载的,TableFactoryService负责加载,TableFactoryService中defaultLoader默认的ServiceLoader,defaultLoader 是final static的所以会在TableFactoryService类加载的时候初始化, 会使用contextClassLoader中的类加载器(ParentFirstClassLoader)初始化,TableFactoryService是AppClassLoader加载器加载的,所以每次运行作业的时候,TableFactoryService类都是使用加载的实例,并没有同fatjar中其它的类一样重新加载,所以defaultLoader对应的类加载器也一直没变,是第一次加载ServiceLoader类的ParentFirstClassLoader,而TableFactoryService加载Connector类的时候一直使用的是defaultLoader,所以会出现上面的问题
解决方式:重启Flink集群
说明:Flink1.10.0已经修复这个问题了,不再使用defaultLoader了,而是每次都使用contextClassLoader