一、定义策略类型

public class Const {

    private Const(){

    }

    /**
     * 日志存储 mysql
     */
    public static final String LOG_STORGE_MYSQL = "mysql";

    /**
     * 日志存储 hbase
     */
    public static final String LOG_STORGE_HBASE = "hbase";

}

二 、定义注解


@Target(ElementType.TYPE)  //作用在类上
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited  //子类可以继承此注解
public @interface HandlerLogType {

    /**
     * 策略类型
     * @return
     */
    String value();
}

三、定义日志策略接口

public interface LogStrategy {

    /**
     * 保存log到hbase以及es
     * @param log
     * @throws IOException
     */
    void saveLog(Log log) throws IOException;

   

    /**
     * 创建日志相关表
     */
    void createLogTable();

}

 四、定义接口实现,有两个,分别HbaseLogStrategy ,MysqlLogStrategy

@Component("HbaseLogStrategy")
@HandlerLogType(Const.LOG_STORGE_HBASE)
public class HbaseLogStrategy implements LogStrategy {

    private static final transient Logger logger = LoggerFactory.getLogger(HbaseLogStrategy.class);
 

    @Override
    public void saveLog(Log log) throws IOException{ 
        logger.info(">>>>>>>>>> hbase save");
    }


    @Override
    public void createLogTable() {
        logger.info(">>>>>>>>>> hbase create");
    }


}
@Service("mysqlLogStrategy ")
@HandlerLogType(Const.LOG_STORGE_MYSQL)
public class MysqlLogStrategy implements LogStrategy {

    private static final transient Logger logger = LoggerFactory.getLogger(MysqlLogStrategy.class);

    @Autowired
    ApplicationContext applicationContext;

    @Override
    public void saveLog(Log log) throws IOException{
        logger.info(">>>>>>>>>> mysql save");
    }

   

    @Override
    public void createLogTable() {
        logger.info(">>>>>>>>>> mysql create");
        DataSource dataSource = applicationContext.getBean(DataSource.class);
        try (Connection connection= dataSource.getConnection();
             Reader resourceAsReader = Resources.getResourceAsReader("sql/generate/bus_log.sql");){
            ScriptRunner runner=new ScriptRunner(connection);
            runner.runScript(resourceAsReader);
        } catch (SQLException | IOException e) {
            logger.error(">>>>>>>>>>mysql建表异常", e);
        }
    }


}

 五、日志策略获取

@Component
public class LogStrategyHandler {
    
    //从配置获取,默认存储模式为hbase
    @Value("${logStorage:hbase}")
    private String logStorageDbType;

    private static Map<String, LogStrategy> logStrategyBeanMap = new ConcurrentHashMap();

    @Autowired
    private ApplicationContext applicationContext;

    @PostConstruct
    public void init() {
        Map<String, Object> logStrategyMap = applicationContext.getBeansWithAnlnotation(HandlerLogType.class);
        logStrategyMap.forEach((k,v)-> {
            Class<LogStrategy> logStrategyClass = (Class<LogStrategy>) v.getClass();
            String type = logStrategyClass.getAnnotation(HandlerLogType.class).value();
            LogStrategy logStrategy= applicationContext.getBean(logStrategyClass);
            logStrategyBeanMap.put(type,logStrategy);
        });
    }

    public LogStrategy getLogStrategy(){
        LogStrategy strategy= logStrategyBeanMap.get(logStorageDbType);
        if(strategy==null) throw new IllegalArgumentException("没有对应的日志存储类型");
        return strategy;
    }
}

 六 调用如下:

//注入
@Autowired
private LogStrategyHandler logStrategyHandler;


 //自动创建日志相关表
 logStrategyHandler.getLogStrategy().createLogTable();

 

 

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐