PreloadTemplate.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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.enums.GroupStrategyEnum;
  10. import org.dbsyncer.manager.model.OperationConfig;
  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 system
  82. reload(map, CommandEnum.PRELOAD_SYSTEM);
  83. // Load user
  84. reload(map, CommandEnum.PRELOAD_USER);
  85. // Load connectors
  86. reload(map, CommandEnum.PRELOAD_CONNECTOR);
  87. // Load mappings
  88. reload(map, CommandEnum.PRELOAD_MAPPING);
  89. // Load metas
  90. reload(map, CommandEnum.PRELOAD_META);
  91. // Load projectGroups
  92. reload(map, CommandEnum.PRELOAD_PROJECT_GROUP);
  93. launch();
  94. }
  95. private void reload(Map<String, JSONObject> map, CommandEnum commandEnum) {
  96. reload(map, commandEnum, commandEnum.getModelType());
  97. }
  98. private void reload(Map<String, JSONObject> map, CommandEnum commandEnum, String groupId) {
  99. JSONObject config = map.get(groupId);
  100. if (null == config) {
  101. return;
  102. }
  103. Group group = JsonUtil.jsonToObj(config.toJSONString(), Group.class);
  104. if (null == group) {
  105. return;
  106. }
  107. List<String> index = group.getIndex();
  108. if (CollectionUtils.isEmpty(index)) {
  109. return;
  110. }
  111. for (String e : index) {
  112. JSONObject m = map.get(e);
  113. ConfigModel model = (ConfigModel) commandEnum.getCommandExecutor().execute(new PreloadCommand(parser, m.toJSONString()));
  114. operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_ADD, commandEnum.getGroupStrategyEnum()));
  115. // Load tableGroups
  116. if (CommandEnum.PRELOAD_MAPPING == commandEnum) {
  117. reload(map, CommandEnum.PRELOAD_TABLE_GROUP, operationTemplate.getGroupId(model, GroupStrategyEnum.PRELOAD_TABLE_GROUP));
  118. }
  119. }
  120. }
  121. private void launch() {
  122. List<Meta> metas = manager.getMetaAll();
  123. if (!CollectionUtils.isEmpty(metas)) {
  124. metas.forEach(m -> {
  125. // 恢复驱动状态
  126. if (MetaEnum.RUNNING.getCode() == m.getState()) {
  127. Mapping mapping = manager.getMapping(m.getMappingId());
  128. manager.start(mapping);
  129. } else if (MetaEnum.STOPPING.getCode() == m.getState()) {
  130. manager.changeMetaState(m.getId(), MetaEnum.READY);
  131. }
  132. });
  133. }
  134. }
  135. @Override
  136. public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
  137. // Load configModels
  138. Arrays.stream(CommandEnum.values()).filter(commandEnum -> commandEnum.isPreload()).forEach(commandEnum -> execute(commandEnum));
  139. // Load plugins
  140. manager.loadPlugins();
  141. // Check connectors status
  142. manager.checkAllConnectorStatus();
  143. // Launch drivers
  144. launch();
  145. }
  146. }