# 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
2
3
# 字段映射模板
TIP
数据同步功能根据数据表主键的值来判断数据的插入或更新映射模板中的字段;
不在映射模板中的字段,不会被修改;
{
"KEY2": "${#row.KEY2}",
"KEY3": "${#row.KEY3}"
}
1
2
3
4
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
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
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
2
3
4
5
6
7
8