ManagerFactory.java 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package org.dbsyncer.manager;
  2. import org.dbsyncer.manager.event.ClosedEvent;
  3. import org.dbsyncer.parser.ProfileComponent;
  4. import org.dbsyncer.parser.enums.MetaEnum;
  5. import org.dbsyncer.parser.model.Mapping;
  6. import org.dbsyncer.parser.model.Meta;
  7. import org.springframework.context.ApplicationListener;
  8. import org.springframework.stereotype.Component;
  9. import org.springframework.util.Assert;
  10. import javax.annotation.Resource;
  11. import java.time.Instant;
  12. import java.util.Map;
  13. /**
  14. * @author AE86
  15. * @version 1.0.0
  16. * @date 2019/9/16 23:59
  17. */
  18. @Component
  19. public class ManagerFactory implements ApplicationListener<ClosedEvent> {
  20. @Resource
  21. private ProfileComponent profileComponent;
  22. @Resource
  23. private Map<String, Puller> map;
  24. @Override
  25. public void onApplicationEvent(ClosedEvent event) {
  26. changeMetaState(event.getMetaId(), MetaEnum.READY);
  27. }
  28. public void start(Mapping mapping) {
  29. Puller puller = getPuller(mapping);
  30. // 标记运行中
  31. changeMetaState(mapping.getMetaId(), MetaEnum.RUNNING);
  32. try {
  33. puller.start(mapping);
  34. } catch (Exception e) {
  35. // rollback
  36. changeMetaState(mapping.getMetaId(), MetaEnum.READY);
  37. throw new ManagerException(e.getMessage());
  38. }
  39. }
  40. public void close(Mapping mapping) {
  41. Puller puller = getPuller(mapping);
  42. // 标记停止中
  43. String metaId = mapping.getMetaId();
  44. changeMetaState(metaId, MetaEnum.STOPPING);
  45. puller.close(metaId);
  46. }
  47. public void changeMetaState(String metaId, MetaEnum metaEnum) {
  48. Meta meta = profileComponent.getMeta(metaId);
  49. int code = metaEnum.getCode();
  50. if (null != meta && meta.getState() != code) {
  51. meta.setState(code);
  52. meta.setUpdateTime(Instant.now().toEpochMilli());
  53. profileComponent.editConfigModel(meta);
  54. }
  55. }
  56. private Puller getPuller(Mapping mapping) {
  57. Assert.notNull(mapping, "驱动不能为空");
  58. String model = mapping.getModel();
  59. String metaId = mapping.getMetaId();
  60. Assert.hasText(model, "同步方式不能为空");
  61. Assert.hasText(metaId, "任务ID不能为空");
  62. Puller puller = map.get(model.concat("Puller"));
  63. Assert.notNull(puller, String.format("未知的同步方式: %s", model));
  64. return puller;
  65. }
  66. }