zoukankan      html  css  js  c++  java
  • 基于Influxdb对InfluxDBResultMapper的一点扩展

    理想很饱满,现实很骨感。

    由于业务需要“灵活可配置”的功能需求,在使用java开发Influxdb查询功能的时候,遇到了一个问题,Measurement注解的名称有可能需要动态变化。

    我们先看下 @Measurement 注解的代码:

    package org.influxdb.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author fmachado
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface Measurement {
    
      String name();
    
      String database() default "[unassigned]";
    
      String retentionPolicy() default "autogen";
    
      TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
    

    问题可以转换为:
    -> 在@Measurement 注解生效之前,将变动的name值写入。

    经过大概两天时间的资料查找,发现了可以通过:java反射去解决
    主要需要操作以下两个类的api

    java.lang.reflect.InvocationHandler;
    java.lang.reflect.Proxy;
    

    最终解决方案,通过继承 InfluxDBResultMapper 的 toPOJO 方法得以解决。
    以下贴出代码:

    public class InfluxDBResultMapperHelper extends InfluxDBResultMapper {
    
        public <T> List<T> toPOJO(final QueryResult queryResult, final Class<T> clazz,String name)
                throws InfluxDBMapperException {
            InvocationHandler handler = Proxy.getInvocationHandler(clazz.getAnnotation(Measurement.class));
            Field hField = null;
            try {
                hField = handler.getClass().getDeclaredField(ME_VALUE);
                hField.setAccessible(true);
                Map memberValues = (Map) hField.get(handler);
                memberValues.put(ME_NAME, name);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return toPOJO(queryResult, clazz, TimeUnit.MILLISECONDS);
        }
    }
    
  • 相关阅读:
    密码学中矩阵相关计算
    系统调用
    用户空间栈&系统空间栈
    drupal重置管理员密码
    中断&异常
    再谈文件描述符
    linux下libpcap抓包分析
    模拟LRU算法&通道处理算法
    [转载] Mysql常用命令行大全
    [转载] php java交互 php/java bridge
  • 原文地址:https://www.cnblogs.com/skywp/p/11671947.html
Copyright © 2011-2022 走看看