2222import com .dtstack .flink .sql .dirtyManager .consumer .AbstractDirtyDataConsumer ;
2323import com .dtstack .flink .sql .dirtyManager .entity .DirtyDataEntity ;
2424import com .dtstack .flink .sql .util .PluginUtil ;
25+ import org .slf4j .Logger ;
26+ import org .slf4j .LoggerFactory ;
2527
2628import java .io .File ;
2729import java .io .Serializable ;
2830import java .lang .reflect .Constructor ;
29- import java .net .URL ;
3031import java .util .Map ;
31- import java .util .Set ;
3232import java .util .concurrent .LinkedBlockingQueue ;
3333import java .util .concurrent .TimeUnit ;
3434import java .util .concurrent .atomic .AtomicLong ;
4141public class DirtyDataManager implements Serializable {
4242 private static final long serialVersionUID = 7190970299538893497L ;
4343
44+ private static final Logger LOG = LoggerFactory .getLogger (DirtyDataManager .class );
45+
4446 private static final String CLASS_PRE_STR = "com.dtstack.flink.sql.dirty" ;
4547
4648 private static final String CLASS_POST_STR = "DirtyDataConsumer" ;
@@ -55,53 +57,72 @@ public class DirtyDataManager implements Serializable {
5557 /**
5658 * 缓存脏数据信息队列
5759 */
58- private LinkedBlockingQueue <DirtyDataEntity > queue = new LinkedBlockingQueue <>();
60+ public final LinkedBlockingQueue <DirtyDataEntity > queue = new LinkedBlockingQueue <>();
5961
6062 /**
6163 * 统计manager收集到的脏数据条数
6264 */
63- private AtomicLong count = new AtomicLong (0 );
64-
65- private AbstractDirtyDataConsumer consumer ;
65+ private final AtomicLong count = new AtomicLong (0 );
6666
67- public static DirtyDataManager newInstance () {
67+ public static AbstractDirtyDataConsumer consumer ;
6868
69- return new DirtyDataManager ();
69+ /**
70+ * 通过参数生成manager实例,并同时将consumer实例化
71+ */
72+ public static DirtyDataManager newInstance (Map <String , String > properties ) throws Exception {
73+ DirtyDataManager manager = new DirtyDataManager ();
74+ manager .blockingInterval = Long .parseLong (properties .getOrDefault ("blockingInterval" , "60" ));
75+ consumer = createConsumer (properties );
76+ consumer .init (properties );
77+ Thread dirtyDataConsumer = new Thread (consumer .setQueue (manager .queue ), "dirtyData Consumer" );
78+ dirtyDataConsumer .start ();
79+ return manager ;
7080 }
7181
72- public AbstractDirtyDataConsumer createConsumer (Map <String , String > properties ) throws Exception {
73- // 利用类加载的方式动态加载
82+ /**
83+ * 通过动态加载的方式加载Consumer
84+ */
85+ private static AbstractDirtyDataConsumer createConsumer (Map <String , String > properties ) throws Exception {
7486 String type = properties .getOrDefault ("type" , "print" );
7587 String consumerType = DIRTY_CONSUMER_PATH + File .separator + type ;
7688 String consumerJar = PluginUtil .getJarFileDirPath (consumerType , properties .getOrDefault ("pluginPath" , null ), "shipfile" );
7789 String className = CLASS_PRE_STR + "." + type .toLowerCase () + "." + upperCaseFirstChar (type + CLASS_POST_STR );
7890
7991 return ClassLoaderManager .newInstance (consumerJar , cl -> {
8092 Class <?> clazz = cl .loadClass (className );
81- Constructor <?> constructor = clazz .getConstructor (String . class );
82- return (AbstractDirtyDataConsumer ) constructor .newInstance (type + CLASS_POST_STR );
93+ Constructor <?> constructor = clazz .getConstructor ();
94+ return (AbstractDirtyDataConsumer ) constructor .newInstance ();
8395 });
8496 }
8597
86- public void close () throws InterruptedException {
87- if (!queue .isEmpty ()) {
88- flush ();
98+ /**
99+ * 脏数据收集任务停止,任务停止之前,需要将队列中所有的数据清空
100+ */
101+ public void close () throws Exception {
102+ if (!queue .isEmpty () && checkConsumer ()) {
103+ consumer .consume ();
89104 }
90- }
91-
92- public void flush () throws InterruptedException {
93- consumer .setQueue (queue );
94- consumer .consume ();
105+ LOG .info ("dirty consumer is closing ......" );
106+ consumer .close ();
95107 }
96108
97109 // 收集脏数据
98110 public void collectDirtyData (String dataInfo , String cause , String field ) throws InterruptedException {
99111 DirtyDataEntity dirtyDataEntity = new DirtyDataEntity (dataInfo , System .currentTimeMillis (), cause , field );
100112 queue .offer (dirtyDataEntity , blockingInterval , TimeUnit .MILLISECONDS );
101113 count .incrementAndGet ();
102- consumer .setQueue (queue );
103114 }
104115
116+ /**
117+ * 查看consumer当前状态
118+ */
119+ public boolean checkConsumer () {
120+ return consumer .isRunning .get ();
121+ }
122+
123+ /**
124+ * 首字母大写
125+ */
105126 private static String upperCaseFirstChar (String str ) {
106127 return str .substring (0 , 1 ).toUpperCase () + str .substring (1 );
107128 }
0 commit comments