# 8.数据同步

TIP

在单据模型中的业务逻辑-数据同步模块,可以实现将单据数据同步到数据库表中,也可以同步到ES中

# 同步到自定义数据表:NkDocSQLDataSync

# 目标

TIP

目标 为写入目标数据库表

目标数据库表必须在主数据源下,如MySQL为同一个数据库,Oracle为同一个用户下的可写视图;

# 条件

TIP

配置SpEL表达式,当结果为true时才进行数据同步

# 重建

TIP

默认情况下,数据同步配置仅在单据保存时触发;

重建开关打开后,在每次手动触发同步功能时均会执行数据映射的操作;

# 数据源

TIP

数据源是一个EL表达式,它的结果将作为主键配置字段映射模板的EL上下文

以下例子展示将卡片NkCardGrid作为数据同步的数据源

data.NkCardGrid
1

# 主键规则模板

TIP

数据同步功能根据数据表主键的值来判断数据的插入或更新操作;

以下例子展示数据表的主键为KEY1,主键的数据获取数据源行项目中的KEY1字段

{
  "KEY1": "${#row.KEY1}"
}
1
2
3

# 字段映射模板

TIP

数据同步功能根据数据表主键的值来判断数据的插入或更新映射模板中的字段;

不在映射模板中的字段,不会被修改;

{
  "KEY2": "${#row.KEY2}",
  "KEY3": "${#row.KEY3}"
}
1
2
3
4

# 同步到搜索引擎:NkDocESDataSync

TIP

同步到搜索引擎与数据库很相似,本章节主要介绍不同的部分;

NkDocESDataSync 服务默认将数据同步到搜索引擎的doc-ext索引中;

如需要将数据同步到其他索引,需要自定义同步服务;

# 目标

TIP

指doc-ext索引的customType字段的值;

通过customType的值可以区分不同的数据类型;

# 主键配置

TIP

与同步到数据库不同的是,ElasticSearch不支持联合主键,因此这里主键配置将返回一个字符串类型的值

#row.KEY1
1

# 自定义同步

# 系统提供了3中适配器来快速开发一个数据同步服务
  • NkAbstractDocDataDiffedSyncAdapter 需实现插入、修改、删除3种方法
  • NkAbstractDocDataGeneralSyncAdapter 需实现单条数据与多条数据两个方法
  • NkAbstractDocDataAsyncAdapter 异步适配器
@Component("YouDataSyncImpl")
public class YouDataSyncImpl extends NkAbstractDocDataGeneralSyncAdapter<KeyType> {

    /**
     * 单条数据写入方法
     */
    protected void doSyncSingle(Map<String,Object> singleData, DocDefDataSync def){
        // 将数据写入到目标
    }
    /**
     * 多条数据写入方法
     */
    protected void doSyncMultiple(List<Map<String,Object>> multipleData, DocDefDataSync def){
        // 将数据写入到目标
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component("YouDataSyncImpl")
public class YouDataSyncImpl extends NkAbstractDocDataDiffedSyncAdapter<KeyType> {

    @Override
    public void onInsert(Map<String,Map<String,Object>> list, DocDefDataSync def) {
    }

    @Override
    public void onModify(Map<String,Map<String,Object>> list, DocDefDataSync def) {
    }

    @Override
    public void onRemove(Map<String,Map<String,Object>> list, DocDefDataSync def) {
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component("YouDataSyncImpl")
public class YouDataSyncImpl extends NkAbstractDocDataAsyncAdapter {

    @Override
    protected void schedule(DocAsyncQueueWithBLOBs asyncQueue) {
        log.info(asyncQueue.getAsyncJson());
    }
}
1
2
3
4
5
6
7
8