PreloadTemplate.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package org.dbsyncer.manager.template;
  2. import com.alibaba.fastjson.JSONObject;
  3. import org.dbsyncer.common.model.Paging;
  4. import org.dbsyncer.common.util.CollectionUtils;
  5. import org.dbsyncer.common.util.JsonUtil;
  6. import org.dbsyncer.manager.Manager;
  7. import org.dbsyncer.manager.command.PreloadCommand;
  8. import org.dbsyncer.manager.enums.CommandEnum;
  9. import org.dbsyncer.manager.model.OperationConfig;
  10. import org.dbsyncer.manager.model.QueryConfig;
  11. import org.dbsyncer.manager.template.OperationTemplate.Group;
  12. import org.dbsyncer.parser.Parser;
  13. import org.dbsyncer.parser.enums.MetaEnum;
  14. import org.dbsyncer.parser.model.ConfigModel;
  15. import org.dbsyncer.parser.model.Mapping;
  16. import org.dbsyncer.parser.model.Meta;
  17. import org.dbsyncer.storage.StorageService;
  18. import org.dbsyncer.storage.constant.ConfigConstant;
  19. import org.dbsyncer.storage.enums.StorageEnum;
  20. import org.dbsyncer.storage.query.Query;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.context.ApplicationListener;
  25. import org.springframework.context.event.ContextRefreshedEvent;
  26. import org.springframework.stereotype.Component;
  27. import java.util.Arrays;
  28. import java.util.List;
  29. import java.util.Map;
  30. /**
  31. * 预加载配置模板
  32. *
  33. * @author AE86
  34. * @version 1.0.0
  35. * @date 2019/9/16 23:59
  36. */
  37. @Component
  38. public final class PreloadTemplate implements ApplicationListener<ContextRefreshedEvent> {
  39. private final Logger logger = LoggerFactory.getLogger(getClass());
  40. @Autowired
  41. private Parser parser;
  42. @Autowired
  43. private Manager manager;
  44. @Autowired
  45. private StorageService storageService;
  46. @Autowired
  47. private OperationTemplate operationTemplate;
  48. public void execute(CommandEnum commandEnum) {
  49. Query query = new Query();
  50. query.setType(StorageEnum.CONFIG);
  51. String modelType = commandEnum.getModelType();
  52. query.addFilter(ConfigConstant.CONFIG_MODEL_TYPE, modelType);
  53. int pageNum = 1;
  54. int pageSize = 20;
  55. long total = 0;
  56. for (; ; ) {
  57. query.setPageNum(pageNum);
  58. query.setPageSize(pageSize);
  59. Paging paging = storageService.query(query);
  60. List<Map> data = (List<Map>) paging.getData();
  61. if (CollectionUtils.isEmpty(data)) {
  62. break;
  63. }
  64. data.forEach(map -> {
  65. String json = (String) map.get(ConfigConstant.CONFIG_MODEL_JSON);
  66. ConfigModel model = (ConfigModel) commandEnum.getCommandExecutor().execute(new PreloadCommand(parser, json));
  67. if (null != model) {
  68. operationTemplate.cache(model, commandEnum.getGroupStrategyEnum());
  69. }
  70. });
  71. total += paging.getTotal();
  72. pageNum++;
  73. }
  74. logger.info("PreLoad {}:{}", modelType, total);
  75. }
  76. public void reload(String json) {
  77. Map<String, JSONObject> map = JsonUtil.jsonToObj(json, Map.class);
  78. if (CollectionUtils.isEmpty(map)) {
  79. return;
  80. }
  81. // Load configs
  82. reload(map, CommandEnum.PRELOAD_CONFIG);
  83. // Load connectors
  84. reload(map, CommandEnum.PRELOAD_CONNECTOR);
  85. // Load mappings
  86. reload(map, CommandEnum.PRELOAD_MAPPING);
  87. // Load metas
  88. reload(map, CommandEnum.PRELOAD_META);
  89. // Load projectGroups
  90. reload(map, CommandEnum.PRELOAD_PROJECT_GROUP);
  91. launch();
  92. }
  93. private void reload(Map<String, JSONObject> map, CommandEnum commandEnum) {
  94. reload(map, commandEnum, commandEnum.getModelType());
  95. }
  96. private void reload(Map<String, JSONObject> map, CommandEnum commandEnum, String groupId) {
  97. JSONObject config = map.get(groupId);
  98. Group group = JsonUtil.jsonToObj(config.toJSONString(), Group.class);
  99. if (null == group) {
  100. return;
  101. }
  102. List<String> index = group.getIndex();
  103. if (CollectionUtils.isEmpty(index)) {
  104. return;
  105. }
  106. for (String e : index) {
  107. JSONObject m = map.get(e);
  108. ConfigModel model = (ConfigModel) commandEnum.getCommandExecutor().execute(new PreloadCommand(parser, m.toJSONString()));
  109. operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_ADD, commandEnum.getGroupStrategyEnum()));
  110. // Load tableGroups
  111. if (CommandEnum.PRELOAD_MAPPING == commandEnum) {
  112. commandEnum = CommandEnum.PRELOAD_TABLE_GROUP;
  113. reload(map, commandEnum, operationTemplate.getGroupId(model, commandEnum.getGroupStrategyEnum()));
  114. }
  115. }
  116. }
  117. private void launch() {
  118. Meta meta = new Meta();
  119. meta.setType(ConfigConstant.META);
  120. QueryConfig<Meta> queryConfig = new QueryConfig<>(meta);
  121. List<Meta> metas = operationTemplate.queryAll(queryConfig);
  122. if (!CollectionUtils.isEmpty(metas)) {
  123. metas.forEach(m -> {
  124. // 恢复驱动状态
  125. if (MetaEnum.RUNNING.getCode() == m.getState()) {
  126. Mapping mapping = manager.getMapping(m.getMappingId());
  127. manager.start(mapping);
  128. } else if (MetaEnum.STOPPING.getCode() == m.getState()) {
  129. manager.changeMetaState(m.getId(), MetaEnum.READY);
  130. }
  131. });
  132. }
  133. }
  134. @Override
  135. public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
  136. // Load configModels
  137. Arrays.stream(CommandEnum.values()).filter(commandEnum -> commandEnum.isPreload()).forEach(commandEnum -> execute(commandEnum));
  138. // Load plugins
  139. manager.loadPlugins();
  140. // Check connectors status
  141. manager.checkAllConnectorStatus();
  142. // Launch drivers
  143. launch();
  144. }
  145. }