# 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