PreloadTemplate.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package org.dbsyncer.manager.template;
  2. import org.dbsyncer.common.model.Paging;
  3. import org.dbsyncer.common.util.CollectionUtils;
  4. import org.dbsyncer.common.util.JsonUtil;
  5. import org.dbsyncer.manager.Manager;
  6. import org.dbsyncer.manager.command.PreloadCommand;
  7. import org.dbsyncer.manager.enums.CommandEnum;
  8. import org.dbsyncer.manager.enums.GroupStrategyEnum;
  9. import org.dbsyncer.manager.model.OperationConfig;
  10. import org.dbsyncer.manager.template.OperationTemplate.Group;
  11. import org.dbsyncer.parser.Parser;
  12. import org.dbsyncer.parser.enums.MetaEnum;
  13. import org.dbsyncer.parser.model.ConfigModel;
  14. import org.dbsyncer.parser.model.Mapping;
  15. import org.dbsyncer.parser.model.Meta;
  16. import org.dbsyncer.storage.StorageService;
  17. import org.dbsyncer.storage.constant.ConfigConstant;
  18. import org.dbsyncer.storage.enums.StorageEnum;
  19. import org.dbsyncer.storage.query.Query;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.context.ApplicationListener;
  24. import org.springframework.context.event.ContextRefreshedEvent;
  25. import org.springframework.stereotype.Component;
  26. import java.util.Arrays;
  27. import java.util.List;
  28. import java.util.Map;
  29. /**
  30. * 预加载配置模板
  31. *
  32. * @author AE86
  33. * @version 1.0.0
  34. * @date 2019/9/16 23:59
  35. */
  36. @Component
  37. public final class PreloadTemplate implements ApplicationListener<ContextRefreshedEvent> {
  38. private final Logger logger = LoggerFactory.getLogger(getClass());
  39. @Autowired
  40. private Parser parser;
  41. @Autowired
  42. private Manager manager;
  43. @Autowired
  44. private StorageService storageService;
  45. @Autowired
  46. private OperationTemplate operationTemplate;
  47. public void execute(CommandEnum commandEnum) {
  48. Query query = new Query();
  49. query.setType(StorageEnum.CONFIG);
  50. String modelType = commandEnum.getModelType();
  51. query.addFilter(ConfigConstant.CONFIG_MODEL_TYPE, modelType);
  52. int pageNum = 1;
  53. int pageSize = 20;
  54. long total = 0;
  55. for (; ; ) {
  56. query.setPageNum(pageNum);
  57. query.setPageSize(pageSize);
  58. Paging paging = storageService.query(query);
  59. List<Map> data = (List<Map>) paging.getData();
  60. if (CollectionUtils.isEmpty(data)) {
  61. break;
  62. }
  63. data.forEach(map -> {
  64. String json = (String) map.get(ConfigConstant.CONFIG_MODEL_JSON);
  65. ConfigModel model = (ConfigModel) commandEnum.getCommandExecutor().execute(new PreloadCommand(parser, json));
  66. if (null != model) {
  67. operationTemplate.cache(model, commandEnum.getGroupStrategyEnum());
  68. }
  69. });
  70. total += paging.getTotal();
  71. pageNum++;
  72. }
  73. logger.info("PreLoad {}:{}", modelType, total);
  74. }
  75. public void reload(String json) {
  76. Map<String, Map> map = JsonUtil.jsonToObj(json, Map.class);
  77. if (CollectionUtils.isEmpty(map)) {
  78. return;
  79. }
  80. // Load system
  81. reload(map, CommandEnum.PRELOAD_SYSTEM);
  82. // Load user
  83. reload(map, CommandEnum.PRELOAD_USER);
  84. // Load connectors
  85. reload(map, CommandEnum.PRELOAD_CONNECTOR);
  86. // Load mappings
  87. reload(map, CommandEnum.PRELOAD_MAPPING);
  88. // Load metas
  89. reload(map, CommandEnum.PRELOAD_META);
  90. // Load projectGroups
  91. reload(map, CommandEnum.PRELOAD_PROJECT_GROUP);
  92. launch();
  93. }
  94. private void reload(Map<String, Map> map, CommandEnum commandEnum) {
  95. reload(map, commandEnum, commandEnum.getModelType());
  96. }
  97. private void reload(Map<String, Map> map, CommandEnum commandEnum, String groupId) {
  98. Map config = map.get(groupId);
  99. if (null == config) {
  100. return;
  101. }
  102. Group group = JsonUtil.jsonToObj(config.toString(), Group.class);
  103. if (null == group) {
  104. return;
  105. }
  106. List<String> index = group.getIndex();
  107. if (CollectionUtils.isEmpty(index)) {
  108. return;
  109. }
  110. for (String e : index) {
  111. Map m = map.get(e);
  112. ConfigModel model = (ConfigModel) commandEnum.getCommandExecutor().execute(new PreloadCommand(parser, m.toString()));
  113. operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_ADD, commandEnum.getGroupStrategyEnum()));
  114. // Load tableGroups
  115. if (CommandEnum.PRELOAD_MAPPING == commandEnum) {
  116. reload(map, CommandEnum.PRELOAD_TABLE_GROUP, operationTemplate.getGroupId(model, GroupStrategyEnum.PRELOAD_TABLE_GROUP));
  117. }
  118. }
  119. }
  120. private void launch() {
  121. List<Meta> metas = manager.getMetaAll();
  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. }