HttpEntity转为List<JavaBean>

前言

继续之前的工作,获取Impala的接口信息后,将其转换为List<JavaBean>的形式,方便后续程序处理。

Code

删除大部分,留点主要的处理过程。

1 JavaBean

首先要对应一些java类,可以直接借鉴cm java api的model。

有三个类,其中TaskBase最重要。

import java.util.concurrent.TimeUnit;

/**
 * Task信息实体类(和接口中获取的信息对应)
 * Created by Dante on 2016/3/25.
 */
public class TaskBase {
    private String queryId;
    private String statement;
    private String queryType;
    private String queryState;
    private String startTime;
    private String endTime;
    private String rowsProduced;
    private String user;
    private String detailsAvailable;
    private String database;
    private Long durationMillis;
    private Long durationMinutes;   //此处有诡异
    private Coordinator coordinator;
    private Attributes attributes;
}
import com.google.gson.annotations.SerializedName;

/**
 * 从接口中获取到的Query信息Attributes实体类。
 * query的部分信息
 * Created by Dante on 2016/3/25.
 */
public class Attributes {

    @SerializedName("thread_storage_wait_time")
    private String threadStorageWaitTime;
    @SerializedName("session_id")
    private String sessionId;
    @SerializedName("planning_wait_time")
    private String planningWaitTime;
    @SerializedName("thread_total_time")
    private String threadTotalTime;
    @SerializedName("stats_missing")
    private String statsMissing;
    @SerializedName("thread_network_send_wait_time_percentage")
    private String threadNetworkSendWaitTimePercentage;
    @SerializedName("thread_cpu_time_percentage")
    private String threadCpuTimePercentage;
    @SerializedName("thread_network_receive_wait_time_percentage")
    private String threadNetworkReceiveWaitTimePercentage;
    @SerializedName("file_formats")
    private String fileFormats;
    @SerializedName("planning_wait_time_percentage")
    private String planningWaitTimePercentage;
    @SerializedName("client_fetch_wait_time")
    private String clientFetchWaitTime;
    @SerializedName("client_fetch_wait_time_percentage")
    private String clientFetchWaitTimePercentage;
    @SerializedName("pool")
    private String pool;
    @SerializedName("session_type")
    private String sessionType;
    @SerializedName("connected_user")
    private String connectedUser;
    @SerializedName("thread_network_receive_wait_time")
    private String threadNetworkReceiveWaitTime;
    @SerializedName("cm_cpu_milliseconds")
    private String cmCpuMilliseconds;
    @SerializedName("impala_version")
    private String impalaVersion;
    @SerializedName("thread_network_send_wait_time")
    private String threadNetworkSendWaitTime;
    @SerializedName("network_address")
    private String networkAddress;
    @SerializedName("query_status")
    private String queryStatus;
    @SerializedName("estimated_per_node_peak_memory")
    private String estimatedPerNodePeakMemory;
    @SerializedName("thread_storage_wait_time_percentage")
    private String threadStorageWaitTimePercentage;
    @SerializedName("thread_cpu_time")
    private String threadCpuTime;
}
/**
 * 从接口中获取到的Query信息Coordinator的实体类
 * Coordinator的hostID
 * Created by Dante on 2016/3/25.
 */
public class Coordinator {
    private String hostId;

    public String getHostId() {
        return hostId;
    }

    public void setHostId(String hostId) {
        this.hostId = hostId;
    }
}

调用接口类

接口
import com.lagou.impala.dante.entity.TaskBase;

import java.util.List;

/**
 * Task的操作相关接口
 * Created by Dante on 2016/3/25.
 */
public interface ITaskTools {
    /**
     * 和cm的管理界面相似,返回最近的几个查询。没有参数
     */
    public List<TaskBase> getRecent();

}
实现
/**
 * Task执行实现类
 * cm接口太坑,很多filter没有用,不能加限制条件
 *  @// TODO: 2016/3/25 : 更改为http连接池的形式,提高性能。
 * Created by Dante on 2016/3/25.
 */
public class DefaultTaskImpl implements ITaskTools{

    CredentialsProvider credsProvider = new BasicCredentialsProvider();

    String username = "";
    String password = "";
    String queryBase = "";
    //区分从接口获得数据的queries和warning
    String queryMemberName = "";


 @Override
    public List<TaskBase> getRecent() {
        //设置认证
        credsProvider.setCredentials(new AuthScope("", AuthScope.ANY_PORT), new UsernamePasswordCredentials(username, password));
        CloseableHttpClient httpclient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
        //get
        HttpGet httpget = new HttpGet(queryBase);
        List<TaskBase> taskBasesList = new LinkedList<>();
        CloseableHttpResponse response = null;
        try {
            response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();
            //将HttpEntity装换为List<JavaBean>
            taskBasesList =  JsonUtil.httpEntityToJsonArray(entity, queryMemberName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return taskBasesList;
    }
}

HttpEntity转List

import com.google.gson.*;
import com.lagou.impala.dante.entity.TaskBase;
import org.apache.http.HttpEntity;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by Dante on 2016/3/25.
 */
public class JsonUtil {


    private static Gson gson = new Gson();
    private static JsonParser jp = new JsonParser();


    /**
     * 从HttpEntity获取数据,并转换为相应的List<JavaBean>
     */
    public static List<TaskBase> httpEntityToJsonArray(HttpEntity entity, String queryMemberName) {
        List<TaskBase> taskBaseList = new LinkedList<>();
        try {
            //将HttpEntity装换为List<JavaBean>
            if (entity != null) {
                //先转为String
                String retSrc = EntityUtils.toString(entity);
                //转为JsonElement
                JsonElement je = jp.parse(retSrc);
                //通过JsonElement转为JsonObject
                JsonObject ja = je.getAsJsonObject();
                //根据queryMemberName 得到JsonArray
                JsonArray jaa = ja.getAsJsonArray(queryMemberName);

                for (JsonElement joo : jaa) {
                    taskBaseList.add(gson.fromJson(joo, TaskBase.class));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return taskBaseList;
    }

}

小测试

code
    @org.junit.Test
    public void getRecent(){
        ITaskTools itt = new DefaultTaskImpl();
        List<TaskBase> taskBaseList = itt.getRecent();
        for(TaskBase tt :taskBaseList) {
            System.out.println(tt.getQueryState());
            System.out.println(tt.getDurationMillis());
            System.out.println(tt.getDurationMinutes());
        }
    }
结果
CREATED
6247021
104
CREATED
994984
16
FINISHED
621
0

总结

CM的rest api比较坑,虽说大部分功能都没什么问题,但是一些细节明显不够,比如说文档里面的额filter,很多条件都没有用,比如说只获取正在运行的任务,这点使用rest是获取不了的,怎么调试都没通,所以只能先获取最近的所有任务,然后再筛选,总感觉这样很sb……

来源:
http://blog.csdn.net/zhaodedong
http://zhaodedong.leanote.com
http://zhaodedong.com

转载于:https://www.cnblogs.com/dantezhao/p/5365138.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值