缘起
最近看Apache Druid的源代码(0.5很老的版本),印象最深的就是对Jackson的多态反序列化和注入的使用了,这里也属于自己的知识盲点,看着复杂的json直接反序列化为可用对象,直呼过瘾。所以一直想找个机会实践一下,这不需求就来了。
需求
我们的实时指标统计是通过Flink Steam SQL计算为维度、指标后后入Hbase,然后通过Phoenix SQL给前台展示。现在新接入Kylin数据源,需要兼容查询Kylin数据源。
看到这个需求,变化点在查询方式上,抽象出查询服务,提供多态支持,但各个指标查询需要的信息是不同的。如Kylin数据源需要查询的表名,聚合函数等,但Hbase数据源压根不需要这些信息,这时候就该Jackson多态反序列化出厂了。
实践
数据库新增querySpec字段,描述指标的个性化需求,如{“type”:“rc”,“tableName”:“TASK_SNAPSHOT”,“fieldName”:“EVENTCODE”}
{“type”:“hbase”}
看如下代码:
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
/**
* Created by yihaibo on 2019-09-11.
*/
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, property = "type", defaultImpl = HbaseQuerySpec.class )
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = HbaseQuerySpec.class, name = "hbase"),
@JsonSubTypes.Type(value = RcHttpQuerySpec.class, name =