SmartReloadManager.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package net.lab1024.smartadmin.common.reload;
  2. import net.lab1024.smartadmin.common.reload.annotation.SmartReload;
  3. import net.lab1024.smartadmin.common.reload.domain.AbstractSmartReloadObject;
  4. import net.lab1024.smartadmin.common.reload.domain.AnnotationReloadObject;
  5. import net.lab1024.smartadmin.common.reload.domain.InterfaceReloadObject;
  6. import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem;
  7. import net.lab1024.smartadmin.common.reload.domain.entity.SmartReloadResult;
  8. import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadCommandInterface;
  9. import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadThreadLogger;
  10. import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadable;
  11. import java.lang.reflect.Method;
  12. import java.util.Map;
  13. import java.util.concurrent.ConcurrentHashMap;
  14. import java.util.concurrent.TimeUnit;
  15. import static java.util.Objects.requireNonNull;
  16. /**
  17. * SmartReloadManager 管理器
  18. * <p>
  19. * 可以在此类中添加 检测任务 以及注册 处理程序
  20. *
  21. * @author zhuoda
  22. */
  23. public class SmartReloadManager {
  24. private Map<String, AbstractSmartReloadObject> tagReloadObject;
  25. private SmartReloadScheduler reloadScheduler;
  26. private SmartReloadThreadLogger logger;
  27. public SmartReloadManager(SmartReloadThreadLogger logger, int threadCount) {
  28. this.tagReloadObject = new ConcurrentHashMap<>();
  29. if (logger == null) {
  30. throw new ExceptionInInitializerError("SmartReloadLoggerImp cannot be null");
  31. }
  32. if (threadCount < 1) {
  33. throw new ExceptionInInitializerError("threadCount must be greater than 1");
  34. }
  35. this.logger = logger;
  36. this.reloadScheduler = new SmartReloadScheduler(this.logger, threadCount);
  37. }
  38. /**
  39. * 默认创建单个线程
  40. *
  41. * @param logger
  42. */
  43. public SmartReloadManager(SmartReloadThreadLogger logger) {
  44. this(logger, 1);
  45. }
  46. /**
  47. * 停止
  48. */
  49. public void shutdown() {
  50. reloadScheduler.shutdown();
  51. }
  52. /**
  53. * 添加任务
  54. *
  55. * @param command SmartReloadCommand实现类
  56. * @param initialDelay 第一次执行前的延迟时间
  57. * @param delay 任务间隔时间
  58. * @param unit 延迟单位 TimeUnit 天、小时、分、秒等
  59. */
  60. public void addCommand(SmartReloadCommandInterface command, long initialDelay, long delay, TimeUnit unit) {
  61. reloadScheduler.addCommand(command, initialDelay, delay, unit);
  62. }
  63. /**
  64. * 注册 实现接口的方式
  65. *
  66. * @param tag
  67. * @param reloadable
  68. */
  69. public void register(String tag, SmartReloadable reloadable) {
  70. requireNonNull(reloadable);
  71. requireNonNull(tag);
  72. if (tagReloadObject.containsKey(tag)) {
  73. logger.error("<<SmartReloadManager>> register duplicated tag reload : " + tag + " , and it will be cover!");
  74. }
  75. tagReloadObject.put(tag, new InterfaceReloadObject(reloadable));
  76. }
  77. /**
  78. * 注册 要求此类必须包含使用了SmartReload注解的方法
  79. *
  80. * @param reloadObject
  81. */
  82. public void register(Object reloadObject) {
  83. requireNonNull(reloadObject);
  84. Method[] declaredMethods = reloadObject.getClass().getDeclaredMethods();
  85. if (declaredMethods != null) {
  86. for (int i = 0; i < declaredMethods.length; i++) {
  87. Method method = declaredMethods[i];
  88. SmartReload annotation = method.getAnnotation(SmartReload.class);
  89. if (annotation != null) {
  90. String reloadTag = annotation.value();
  91. this.register(reloadTag, new AnnotationReloadObject(reloadObject, method));
  92. }
  93. }
  94. }
  95. }
  96. private void register(String tag, AbstractSmartReloadObject reloadObject) {
  97. if (tagReloadObject.containsKey(tag)) {
  98. logger.error("<<SmartReloadManager>> register duplicated tag reload : " + tag + " , and it will be cover!");
  99. }
  100. tagReloadObject.put(tag, reloadObject);
  101. }
  102. /**
  103. * Reload 已注册的ReloadItem
  104. *
  105. * @param reloadItem
  106. * @return SmartReloadResult
  107. */
  108. public SmartReloadResult doReload(ReloadItem reloadItem) {
  109. AbstractSmartReloadObject reloadObject = tagReloadObject.get(reloadItem.getTag());
  110. if (reloadObject != null) {
  111. return reloadObject.reload(reloadItem);
  112. }
  113. // 返回注册结果
  114. return new SmartReloadResult(reloadItem.getTag(), reloadItem.getArgs(), reloadItem.getIdentification(), false, "No registered reload handler was found");
  115. }
  116. }