admin
2019-05-14 744c4998b33ca1e6010bbdce1bf7fd36e8c388f8
tomcat请求日志分析,订单部分代码优化
12个文件已修改
2个文件已添加
408 ■■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/aspect/SignValidateAspect.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/admin/GoodsSubClassLabelAdminController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/client/RecommendController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/log/LogHelper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/LostOrderServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderProcessServiceImpl.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderServiceImpl.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoBuyRelationMapServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/LostOrderService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/taobao/TaoBaoUtil.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/vo/msg/UserCommonMsgVO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/HttpUtil.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/statistic/http/HttpRequestInfo.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
utils/src/main/java/org/yeshi/utils/statistic/http/LocalhostAccessLogUtil.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/aspect/SignValidateAspect.java
@@ -24,6 +24,7 @@
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.ThreadUtil;
import net.sf.json.JSONObject;
@@ -85,16 +86,25 @@
        // 签名是否正确
        if (isRight) {
            // 判断签名超时
            // if (Math.abs((Long.parseLong(acceptData.getTime()) -
            // System.currentTimeMillis())) > 1000 * 60 * 10) {
            // JSONObject data = new JSONObject();
            // data.put("code", -2);
            // data.put("msg", "时间错误");
            // out.print(data);
            // out.close();
            // return null;
            // }
            // uid
            if (Math.abs((Long.parseLong(acceptData.getTime()) - System.currentTimeMillis())) > 1000 * 60 * 10) {
                JSONObject data = new JSONObject();
                data.put("code", -2);
                data.put("msg", "时间错误");
                out.print(data);
                out.close();
                return null;
            }
            final String url = request.getRequestURI();
            @SuppressWarnings("unchecked")
            final Map<String, Object> params = request.getParameterMap();
            ThreadUtil.run(new Runnable() {
                @Override
                public void run() {
                    // 记录请求日志
                    LogHelper.requestInfo(url, params);
                }
            });
            Object obj = null;
            try {
fanli/src/main/java/com/yeshi/fanli/controller/admin/GoodsSubClassLabelAdminController.java
@@ -73,7 +73,6 @@
        }
        if (label.getId() == null)// 新增
        {
            if (label.getGoodsClass().getId() == null) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("分类不能为空"));
                return;
fanli/src/main/java/com/yeshi/fanli/controller/client/RecommendController.java
@@ -2059,7 +2059,7 @@
            goodsJson.put("shopInfo", tbShopInfo);
        }
        goodsJson.put("fanliValid", true);// 是否有返利
        goodsJson.put("fanliValid",Math.random()>0.5? true:false);// 是否有返利
        // 分享路径
        String shareUrl = String.format("%s?id=" + tb.getAuctionId(), Constant.systemCommonConfig.getAppShareInfoUrl());
fanli/src/main/java/com/yeshi/fanli/log/LogHelper.java
@@ -4,6 +4,12 @@
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
@@ -32,6 +38,8 @@
    private static Logger loginLogger = Logger.getLogger("loginLog");
    private static Logger smsLogger = Logger.getLogger("smsLog");
    private static Logger requestLogger = Logger.getLogger("requestLog");
    public static void userInfo(Object obj) {
        userLogger.info(obj);
@@ -132,6 +140,32 @@
        }
    }
    /**
     * 请求日志
     *
     * @param request
     */
    public static void requestInfo(String url, Map<String, Object> map) {
        try {
            Iterator<String> its = map.keySet().iterator();
            List<String> list = new ArrayList<>();
            while (its.hasNext()) {
                String key = its.next();
                Object value = map.get(key);
                Object[] values = (Object[]) value;
                list.add(key + "=" + values[0].toString());
            }
            String paramsStr = "";
            for (String param : list)
                paramsStr += param + "&";
            if (paramsStr.endsWith("&"))
                paramsStr = paramsStr.substring(0, paramsStr.length() - 1);
            requestLogger.info(String.format("%s#####%s", url, paramsStr));
        } catch (Exception e) {
        }
    }
    public static void httpInfo(String url, String params, String response) {
        String msg = url + "\n" + params + "\n" + response;
        httpLogger.info(msg);
fanli/src/main/java/com/yeshi/fanli/service/impl/order/LostOrderServiceImpl.java
@@ -53,7 +53,7 @@
        }
        // 订单是否已申诉
        List<LostOrder> orderList = lostOrderMapper.selectByOrderId(orderId);
        List<LostOrder> orderList = lostOrderMapper.selectByOrderIdAndType(orderId, type);
        if (orderList != null && orderList.size() > 0) {
            if (orderList.get(0).getState() == 0 || orderList.get(0).getResultCode() == LostOrder.RESULT_CODE_VERFING) {
                return -2;
@@ -213,9 +213,9 @@
    @Transactional
    @Override
    public void processSuceess(String orderId) {
    public void processSuceess(String orderId, int orderType) {
        // 查询订单号是否在申诉列表中
        List<LostOrder> list = lostOrderMapper.selectByOrderId(orderId);
        List<LostOrder> list = lostOrderMapper.selectByOrderIdAndType(orderId, orderType);
        if (list == null || list.size() == 0)
            return;
        for (LostOrder lo : list) {
@@ -235,8 +235,8 @@
    }
    @Override
    public void processFail(String orderId) {
        List<LostOrder> list = lostOrderMapper.selectByOrderId(orderId);
    public void processFail(String orderId, int orderType) {
        List<LostOrder> list = lostOrderMapper.selectByOrderIdAndType(orderId, orderType);
        if (list != null)
            for (LostOrder order : list) {
                LostOrder update = new LostOrder();
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderProcessServiceImpl.java
@@ -17,14 +17,11 @@
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dao.mybatis.AccountMessageMapper;
import com.yeshi.fanli.dao.mybatis.HongBaoManageMapper;
import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper;
import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
import com.yeshi.fanli.dao.mybatis.money.UserMoneyDetailMapper;
import com.yeshi.fanli.dao.mybatis.order.HongBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.order.OrderMapper;
import com.yeshi.fanli.dao.mybatis.share.PidUserMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanOrderMapper;
import com.yeshi.fanli.dto.HongBao;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
@@ -46,14 +43,11 @@
import com.yeshi.fanli.exception.order.CommonOrderException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.hongbao.AccountDetailsHongBaoMapService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService;
import com.yeshi.fanli.service.inter.hongbao.HongBaoV2Service;
import com.yeshi.fanli.service.inter.msg.UserMoneyMsgNotificationService;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.LostOrderService;
import com.yeshi.fanli.service.inter.order.OrderProcessService;
import com.yeshi.fanli.service.inter.order.OrderService;
import com.yeshi.fanli.service.inter.push.PushService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoBuyRelationMapService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoOrderService;
import com.yeshi.fanli.service.inter.taobao.TaoBaoUnionConfigService;
@@ -64,7 +58,6 @@
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.util.CMQManager;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TaoBaoConstant;
import com.yeshi.fanli.util.TimeUtil;
@@ -78,22 +71,7 @@
    private OrderMapper orderMapper;
    @Resource
    private PidUserMapper pidUserMapper;
    @Resource
    private UserInfoMapper userInfoMapper;
    @Resource
    private HongBaoManageMapper hongBaoManageMapper;
    @Resource
    private AccountMessageMapper accountMessageMapper;
    @Resource
    private OrderService orderService;
    @Resource
    private PushService pushService;
    @Resource
    private UserNotificationService userNotificationService;
@@ -107,17 +85,12 @@
    @Resource
    private TaoBaoOrderService taoBaoOrderService;
    @Resource
    private RedisManager redisManager;
    @Resource
    private LostOrderService lostOrderService;
    @Resource
    private TaoBaoWeiQuanOrderMapper taoBaoWeiQuanOrderMapper;
    @Resource
    private HongBaoManageService hongBaoManageService;
    @Resource
    private AccountDetailsHongBaoMapService accountDetailsHongBaoMapService;
@@ -142,6 +115,12 @@
    @Resource
    private TaoBaoBuyRelationMapService taoBaoBuyRelationMapService;
    @Resource
    private CommonOrderService commonOrderService;
    @Resource
    private HongBaoV2Service hongBaoV2Service;
    @Override
    public void processOrder(Map<String, List<TaoBaoOrder>> orders) {
@@ -166,7 +145,7 @@
                    shareOrderMap.put(orderId, list);
                } else {
                    PidUser pidUser = pidUserMapper.selectByPid(pid);
                    PidUser pidUser = null;//pidUserMapper.selectByPid(pid);
                    if (pidUser != null && pidUser.getType() == PidUser.TYPE_SHARE_GOODS) {// 商品分享订单
                        // List<PidOrder> pidOrderList = new ArrayList<>();
                        // for (TaoBaoOrder order : list) {
@@ -187,41 +166,6 @@
        processShareGoodsOrder(shareOrderMap);
    }
    /**
     * 利用redis的原子性将订单号锁住,不让其他处理
     *
     * @param orderId
     */
    private void redisLockOrder(String orderId) {
        String key = "doorder-" + orderId;
        redisManager.cacheCommonString(key, "1");
    }
    /**
     * 订单解锁
     *
     * @param orderId
     */
    private void redisUnlockOrder(String orderId) {
        String key = "doorder-" + orderId;
        redisManager.removeCommonString(key);
    }
    /**
     * 订单是否被锁住了
     *
     * @param orderId
     * @return
     */
    private boolean isRedisLockOrder(String orderId) {
        String key = "doorder-" + orderId;
        String doing = redisManager.getCommonString(key);
        if (!StringUtil.isNullOrEmpty(doing))
            return true;
        else
            return false;
    }
    @Override
    public void processShopingFanliOrder(Map<String, List<TaoBaoOrder>> orders) {
        // 查询在Order中是否存在该订单号
@@ -240,7 +184,7 @@
                // 出错了就不处理该订单了,需要定期检查
                // 更改丢失订单的状态
                lostOrderService.processSuceess(orderId);
                lostOrderService.processSuceess(orderId, Constant.SOURCE_TYPE_TAOBAO);
            } catch (HongBaoException e1) {
                e1.printStackTrace();
@@ -277,30 +221,6 @@
            }
        }
    }
    /**
     * 获取最大的创建时间与最小的创建时间
     *
     * @param hongBaoList
     * @return
     */
    private Map<String, Long> getMaxAndMinCreateTime(List<HongBao> hongBaoList) {
        if (hongBaoList.size() > 0) {
            Map<String, Long> map = new HashMap<>();
            long min = hongBaoList.get(0).getCreatetime();
            long max = hongBaoList.get(0).getCreatetime();
            for (HongBao hb : hongBaoList) {
                if (hb.getCreatetime() > max)
                    max = hb.getCreatetime();
                if (hb.getCreatetime() < min)
                    min = hb.getCreatetime();
            }
            map.put("max", max);
            map.put("min", min);
            return map;
        }
        return null;
    }
    @Override
@@ -362,20 +282,6 @@
        }
    }
    /**
     * 判断订单是否失效 全部订单失效才判断为失效
     *
     * @param list
     * @return
     */
    private boolean isOrderValid(List<TaoBaoOrder> list) {
        int validCount = 0;
        for (TaoBaoOrder order : list) {
            if (order.getOrderState().equalsIgnoreCase("订单失效"))
                validCount++;
        }
        return validCount >= list.size();
    }
    @Resource
    private HongBaoOrderMapper hongBaoOrderMapper;
@@ -884,11 +790,7 @@
    }
    @Resource
    private CommonOrderService commonOrderService;
    @Resource
    private HongBaoV2Service hongBaoV2Service;
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    @Override
@@ -905,11 +807,11 @@
            String pid = String.format("mm_%s_%s_%s", configList.get(0).getAccountId(),
                    orderList.get(0).getSourceMediaId(), orderList.get(0).getAdPositionId());
            Order oldOrder = orderMapper.selectOrderByOrderId(orderId);
            Order oldOrder = orderMapper.selectOrderByOrderIdAndOrderType(orderId, Constant.SOURCE_TYPE_TAOBAO);
            // 原来不存在订单
            Long uid = null;
            if (oldOrder == null) {
                PidUser pidUser = pidUserMapper.selectByPid(pid);
                PidUser pidUser =null;// pidUserMapper.selectByPid(pid);
                if (pidUser != null) {
                    uid = pidUser.getUid();
@@ -1013,7 +915,7 @@
                    orderList.get(0).getSourceMediaId(), orderList.get(0).getAdPositionId());
            // 原来不存在订单
            Long uid = null;
            PidUser pidUser = pidUserMapper.selectByPid(pid);
            PidUser pidUser =null; //pidUserMapper.selectByPid(pid);-PID机制移除
            if (pidUser != null)
                uid = pidUser.getUid();
            else {
fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderServiceImpl.java
@@ -6,8 +6,6 @@
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dao.mybatis.order.OrderMapper;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
@@ -32,7 +30,8 @@
    @Resource
    private HongBaoOrderService hongBaoOrderService;
    //@Transactional(propagation = Propagation.NESTED, rollbackFor = Exception.class)
    // @Transactional(propagation = Propagation.NESTED, rollbackFor =
    // Exception.class)
    public boolean addOrder(Order order) throws Exception {
        order.setVersion(2);
        WriteLock writeLock = orderLock.writeLock();
@@ -79,31 +78,10 @@
        return true;
    }
    @Transactional
    public List<Order> setOrderState(final String orderid, final int orderType) {
        List<Order> orderList = orderMapper.selectOrderByOrderIdAndOrderType(orderid, orderType);
        if (orderList != null)
            for (Order order : orderList) {
                if (order.getDrawbackTime() == null || order.getDrawbackTime() <= 0) {
                    Order updateOrder = new Order();
                    updateOrder.setId(order.getId());
                    updateOrder.setDrawbackTime(java.lang.System.currentTimeMillis());
                    updateOrder.setState(Order.STATE_SHIXIAO);
                    orderMapper.updateByPrimaryKeySelective(updateOrder);
                    order.setDrawbackTime(updateOrder.getDrawbackTime());
                    order.setState(updateOrder.getState());
                }
            }
        return orderList;
    }
    @Override
    public Order findOrderByOrderIdAndType(String orderId, int type) {
        List<Order> list = orderMapper.selectOrderByOrderIdAndOrderType(orderId, type);
        if (list.size() > 0) {
            return list.get(0);
        }
        return null;
        Order order = orderMapper.selectOrderByOrderIdAndOrderType(orderId, type);
        return order;
    }
    @Override
fanli/src/main/java/com/yeshi/fanli/service/impl/taobao/TaoBaoBuyRelationMapServiceImpl.java
@@ -11,6 +11,7 @@
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoBuyRelationMapMapper;
import com.yeshi.fanli.entity.taobao.TaoBaoBuyRelationMap;
import com.yeshi.fanli.exception.taobao.TaoBaoBuyRelationMapException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.taobao.TaoBaoBuyRelationMapService;
import com.yeshi.fanli.util.StringUtil;
@@ -45,7 +46,11 @@
                taoBaoBuyRelationMapMapper.insertSelective(map);
                relationId = map.getRelationId();
            } catch (Exception e) {
                e.printStackTrace();
                try {
                    LogHelper.errorDetailInfo(e);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        }
fanli/src/main/java/com/yeshi/fanli/service/inter/order/LostOrderService.java
@@ -41,14 +41,14 @@
     * 
     * @param orderId
     */
    void processSuceess(String orderId);
    void processSuceess(String orderId,int orderType);
    /**
     * 订单处理失败
     * 
     * @param orderId
     */
    void processFail(String orderId);
    void processFail(String orderId,int orderType);
    /**
     * 订单处理失败批量处理
fanli/src/main/java/com/yeshi/fanli/util/taobao/TaoBaoUtil.java
@@ -759,13 +759,13 @@
        tg.setTaoBaoHongBaoInfo(hongBaoInfo);
        // 测试使用
        tg.setMoneyType(Math.random() > 0.5 ? 1 : 2);
        tg.setSalesType(Math.random() > 0.5 ? 1 : 2);
        tg.setSalesType(Math.random() > 0.5 ? tg.getSalesType() : 3);
        List<ClientTextStyleVO> labels = new ArrayList<>();
        labels.add(new ClientTextStyleVO("标签测试内容", "#FF0000"));
        labels.add(new ClientTextStyleVO("标签测试内容", "#00FF00"));
        tg.setLabels(labels);
//        tg.setMoneyType(Math.random() > 0.5 ? 1 : 2);
//        tg.setSalesType(Math.random() > 0.5 ? 1 : 2);
//        tg.setSalesType(Math.random() > 0.5 ? tg.getSalesType() : 3);
//        List<ClientTextStyleVO> labels = new ArrayList<>();
//        labels.add(new ClientTextStyleVO("标签测试内容", "#FF0000"));
//        labels.add(new ClientTextStyleVO("标签测试内容", "#00FF00"));
//        tg.setLabels(labels);
        return tg;
    }
@@ -1011,13 +1011,13 @@
        tg.setTaoBaoHongBaoInfo(hongBaoInfo);
        // 测试使用
        tg.setMoneyType(Math.random() > 0.5 ? 1 : 2);
        tg.setSalesType(Math.random() > 0.5 ? 1 : 2);
        tg.setSalesType(Math.random() > 0.5 ? tg.getSalesType() : 3);
        List<ClientTextStyleVO> labels = new ArrayList<>();
        labels.add(new ClientTextStyleVO("标签测试内容", "#FF0000"));
        labels.add(new ClientTextStyleVO("标签测试内容", "#00FF00"));
        tg.setLabels(labels);
//        tg.setMoneyType(Math.random() > 0.5 ? 1 : 2);
//        tg.setSalesType(Math.random() > 0.5 ? 1 : 2);
//        tg.setSalesType(Math.random() > 0.5 ? tg.getSalesType() : 3);
//        List<ClientTextStyleVO> labels = new ArrayList<>();
//        labels.add(new ClientTextStyleVO("标签测试内容", "#FF0000"));
//        labels.add(new ClientTextStyleVO("标签测试内容", "#00FF00"));
//        tg.setLabels(labels);
        return tg;
    }
fanli/src/main/java/com/yeshi/fanli/vo/msg/UserCommonMsgVO.java
@@ -9,6 +9,7 @@
    public static String TYPE_GUANXUAN = "guanxuan";
    public static String TYPE_ZHUSHOU = "zhushou";
    public static String TYPE_RECOMMEND = "recommend";
    public static String TYPE_SYSTEM = "system";//系统消息
    private String icon;
    private String title;
utils/src/main/java/org/yeshi/utils/HttpUtil.java
@@ -353,6 +353,7 @@
    public static String post(String url, Map<String, String> map, Map<String, String> headers) {
        HttpClient client = new HttpClient();
        client.getHostConfiguration().setProxy("192.168.1.122", 8888);
        PostMethod pm = new PostMethod(url);// 创建HttpPost对象
        NameValuePair[] ns = new NameValuePair[map.keySet().size()];
        Iterator<String> its = map.keySet().iterator();
utils/src/main/java/org/yeshi/utils/statistic/http/HttpRequestInfo.java
New file
@@ -0,0 +1,67 @@
package org.yeshi.utils.statistic.http;
import java.util.Map;
/**
 * http请求信息
 *
 * @author Administrator
 *
 */
public class HttpRequestInfo {
    private String url;
    private String method;
    private String protocal;
    private int stateCode;
    private int time;
    private Map<String, Object> params;
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getMethod() {
        return method;
    }
    public void setMethod(String method) {
        this.method = method;
    }
    public String getProtocal() {
        return protocal;
    }
    public void setProtocal(String protocal) {
        this.protocal = protocal;
    }
    public int getStateCode() {
        return stateCode;
    }
    public void setStateCode(int stateCode) {
        this.stateCode = stateCode;
    }
    public int getTime() {
        return time;
    }
    public void setTime(int time) {
        this.time = time;
    }
    public Map<String, Object> getParams() {
        return params;
    }
    public void setParams(Map<String, Object> params) {
        this.params = params;
    }
}
utils/src/main/java/org/yeshi/utils/statistic/http/LocalhostAccessLogUtil.java
New file
@@ -0,0 +1,73 @@
package org.yeshi.utils.statistic.http;
import java.util.List;
public class LocalhostAccessLogUtil {
    /**
     * 将单行日志文件解析为对象
     *
     * @param content
     * @return
     */
    public static HttpRequestInfo parseTomcatSingleLine(String content) {
        try {
            HttpRequestInfo info = new HttpRequestInfo();
            int start = content.indexOf("\"");
            content = content.substring(start, content.length());
            start = content.indexOf("\"", 1);
            String url = content.substring(1, start);
            info.setMethod(url.split(" ")[0]);
            // 链接
            info.setUrl(url.split(" ")[1].split("\\?")[0]);
            // 时间
            info.setProtocal(url.split(" ")[2]);
            String[] sts = content.substring(start + 1, content.length()).trim().split(" ");
            info.setStateCode(Integer.parseInt(sts[0]));
            info.setTime(sts[1].trim().equalsIgnoreCase("-") ? Integer.MAX_VALUE : Integer.parseInt(sts[1]));
            return info;
        } catch (Exception e) {
        }
        return null;
    }
    /**
     * 求请求时间的平均值
     *
     * @param list
     * @return
     */
    public static int getTimeAvg(List<HttpRequestInfo> list) {
        int count = 0;
        long total = 0;
        for (HttpRequestInfo info : list) {
            // 去除最大数值与最小数值
            if (info.getTime() > 0 && info.getTime() < Integer.MAX_VALUE) {
                total += info.getTime();
                count++;
            }
        }
        if (count <= 0)
            return 0;
        return (int) (total / count);
    }
    /**
     * 获取方差
     *
     * @param list
     * @return
     */
    public static int getVariance(List<HttpRequestInfo> list) {
        int avg = getTimeAvg(list);
        long total = 0;
        for (HttpRequestInfo info : list) {
            total += Math.pow(info.getTime() - avg, 2);
        }
        return (int) (total / list.size());
    }
}