GpsDataLoaderThread.java 3.9 KB
package com.bsth.data.gpsdata.thread;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bsth.data.BasicData;
import com.bsth.data.gpsdata.GpsEntity;
import com.bsth.data.gpsdata.GpsRealData;
import com.bsth.data.gpsdata.arrival.GpsRealAnalyse;
import com.bsth.data.gpsdata.recovery.GpsDataRecovery;
import com.bsth.util.ConfigUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by panzhao on 2017/1/11.
 */
@Component
public class GpsDataLoaderThread extends Thread {

    Logger logger = LoggerFactory.getLogger(GpsDataLoaderThread.class);

    /**
     * 构造函数
     */
    public GpsDataLoaderThread() {
        url = ConfigUtil.get("http.gps.real.url");
    }

    // 网关数据接口地址
    private static String url;

    @Autowired
    GpsRealData gpsRealData;

    @Autowired
    GpsRealAnalyse gpsRealAnalyse;

    @Override
    public void run() {
        try {
            //如果正在恢复数据
            if (GpsDataRecovery.run)
                return;

            load();
        } catch (Exception e) {
            logger.error("", e);
        }
    }

    public void load() throws Exception {
        List<GpsEntity> list = null;
        List<GpsEntity> updateList = new ArrayList<>();
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        try {
            httpClient = HttpClients.createDefault();
            HttpGet get = new HttpGet(url);

            response = httpClient.execute(get);

            HttpEntity entity = response.getEntity();
            if (null != entity) {
                BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
                StringBuffer stringBuffer = new StringBuffer();
                String str = "";
                while ((str = br.readLine()) != null)
                    stringBuffer.append(str);

                JSONObject jsonObj = JSON.parseObject(stringBuffer.toString());

                if (jsonObj != null)
                    list = JSON.parseArray(jsonObj.getString("data"), GpsEntity.class);

                String nbbm;
                GpsEntity old;
                for (GpsEntity gps : list) {
                    //没有设备号
                    if (StringUtils.isBlank(gps.getDeviceId()))
                        continue;

                    old = gpsRealData.get(gps.getDeviceId());
                    if (old != null &&
                            old.getTimestamp() == gps.getTimestamp())
                        continue;

                    nbbm = BasicData.deviceId2NbbmMap.get(gps.getDeviceId());
                    if (StringUtils.isBlank(nbbm))
                        gps.setIncomplete(true);//标记为异常数据
                    else
                        gps.setNbbm(nbbm);
                    //有更新的点位
                    updateList.add(gps);
                }
                //分析数据
                gpsRealAnalyse.analyse(updateList);
            } else
                logger.error("real gps result is null");
        } catch (Exception e) {
            logger.error("", e);
        } finally {
            if (null != httpClient)
                httpClient.close();
            if (null != response)
                response.close();
        }
    }
}