ConfiguratorFactory.java 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package com.jd.platform.jlog.core;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import java.io.IOException;
  5. import java.util.ServiceLoader;
  6. import java.util.concurrent.atomic.AtomicBoolean;
  7. /**
  8. * @author tangbohu
  9. * @version 1.0.0
  10. * @desc 参考log4J
  11. * @ClassName ConfiguratorFactory.java
  12. * @createTime 2022年02月15日 21:54:00
  13. */
  14. public class ConfiguratorFactory {
  15. private static final Logger LOGGER = LoggerFactory.getLogger(ConfiguratorFactory.class);
  16. private static volatile Configurator instance = null;
  17. public static volatile Configurator base = null;
  18. static AtomicBoolean useFileConfig = new AtomicBoolean(true);
  19. public static Configurator getInstance(){
  20. if (instance == null) {
  21. synchronized (Configurator.class) {
  22. if (instance == null) {
  23. instance = buildConfiguration();
  24. LOGGER.info("构建总配置器单例完成 instance 获取类型结果:{}", instance.getType());
  25. }
  26. }
  27. }
  28. return instance;
  29. }
  30. /**
  31. * SPI实现装载不同的配置器
  32. * @return 配置器
  33. */
  34. private static Configurator buildConfiguration() {
  35. try {
  36. /*
  37. 配置文件的配置器
  38. */
  39. base = new FileConfigurator();
  40. } catch (IOException e) {
  41. LOGGER.info("文件配置器构建失败", e);
  42. throw new RuntimeException("build file buildConfiguration fail", e);
  43. }
  44. /*
  45. 配置中心的配置器,如果没有就用文件配置器
  46. */
  47. ServiceLoader<ConfiguratorProvider> builders = ServiceLoader.load(ConfiguratorProvider.class);
  48. //noinspection LoopStatementThatDoesntLoop
  49. for (ConfiguratorProvider provider : builders) {
  50. LOGGER.info("配置中心的配置器获取成功, 类型为:{}", provider.build().getType());
  51. useFileConfig.set(false);
  52. return provider.build();
  53. }
  54. return base;
  55. }
  56. /**
  57. * 自定义配置器覆盖文件配置器
  58. * @param configurator 配置器
  59. */
  60. public static synchronized void cover(Configurator configurator){
  61. instance = configurator;
  62. LOGGER.info("自定义配置器类型:{}", instance.getType());
  63. }
  64. }