项目中需要同步中台基础数据事件包含:
- 用户( 行政组织人员 、 外聘服务人员 、 教师 )
- 部门
- 用户部门管理
- 学校
项目整体架构
定义策略
针对这些不同的数据,都有增加、编辑、删除操作
策略接口和一组实现这个接口的策略类
基于接口而非实现编程,可以灵活地替换不同的策略
- 策略接口
/**
* @author lc
* @desc (数据处理接口定义)
* @date 2021/1/7
*/
public interface SyncDataStrategy {
void add(Message message);
void update(Message message);
void delete(Message message);
}
- 策略实现
用户(UserSyncDataServiceImpl)、部门(DepartmentSyncDataServiceImpl)
学校(SchoolSyncDataServiceImpl)、用户部门(UserDepartmentSyncDataServiceImpl)
/**
* @author lc
* @desc (部门数据同步)
* @date 2021/1/7
*/
@Service
public class DepartmentSyncDataServiceImpl implements SyncDataStrategy {
@Autowired
private ImService imService;
@Autowired
private ImGroupService groupService;
@Autowired
private RedisDistributedLock redisDistributedLock;
@Override
public void add(Message message) {
}
@Override
public void update(Message message) {
}
@Override
public void delete(Message message) {
}
}
策略创建
策略模式会包含一组策略,一般会根据类型来判断使用哪个策略
可以将根据类型创建策略的逻辑抽取出来,放在工厂类中
/**
* @author lc
* @desc (数据同步工厂类)
* @date 2021/1/7
*/
@Service
public class SyncDataStrategyFactory {
@Autowired
private UserSyncDataServiceImpl userSyncDataService;
@Autowired
private SchoolSyncDataServiceImpl schoolSyncDataService;
@Autowired
private DepartmentSyncDataServiceImpl departmentSyncDataService;
@Autowired
private UserDepartmentSyncDataServiceImpl userDepartmentSyncDataService;
public SyncDataStrategy get(String type) {
SyncDataStrategy syncDataStrategy = null;
switch (type) {
case EventCodeConstant.SCHOOL:
syncDataStrategy = schoolSyncDataService;
break;
case EventCodeConstant.DEPARTMENT:
syncDataStrategy = departmentSyncDataService;
break;
case EventCodeConstant.USER_DEPARTMENT:
syncDataStrategy = userDepartmentSyncDataService;
break;
case EventCodeConstant.USER_EDUORG:
case EventCodeConstant.USER_EXTERNAL:
case EventCodeConstant.USER_TEACHER:
syncDataStrategy = userSyncDataService;
break;
}
return syncDataStrategy;
}
}
策略使用
/**
* @author lc
* @desc (数据同步处理)
* @date 2021/1/7
*/
@Slf4j
@Component
public class SyncDataHandler implements MessageHandler, HistoryDataHandler {
@Autowired
private SyncDataStrategyFactory syncDataStrategyFactory;
@Autowired
private EcpSchoolService schoolService;
@Autowired
private SchoolManager schoolManager;
/**
* 增量数据处理
* @param message MQ消息
*/
@Override
public void handleMessage(Message message) {
String type = message.getObjectCode();
// 根据类型获取对应的策略来进行数据处理
SyncDataStrategy syncDataStrategy = syncDataStrategyFactory.get(type);
if (OperationType.INSERT.getDesc().equals(desc)) {
syncDataStrategy.add(message);
} else if (OperationType.MODIFY.getDesc().equals(desc)) {
syncDataStrategy.update(message);
} else if (OperationType.DELETE.getDesc().equals(desc)) {
syncDataStrategy.delete(message);
}
}
}