package com.matrix.core.exception;
|
|
import com.alibaba.fastjson.support.spring.FastJsonJsonView;
|
import com.matrix.core.constance.MatrixConstance;
|
import com.matrix.core.constance.SystemErrorCode;
|
import com.matrix.core.tools.*;
|
import com.matrix.system.common.bean.ProjException;
|
import com.matrix.system.common.bean.SysUsers;
|
import com.matrix.system.common.dao.ProjExceptionDao;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.servlet.HandlerExceptionResolver;
|
import org.springframework.web.servlet.ModelAndView;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.PrintWriter;
|
import java.io.StringWriter;
|
import java.util.*;
|
|
/**
|
* @author 姜友瑶
|
* @description 全局异常处理类
|
* @data 2016-06-26
|
*/
|
@Service("GlobleExceptionResolver")
|
public class GlobleExceptionResolver implements HandlerExceptionResolver {
|
|
private static final String TRUE = "true";
|
|
/**
|
* 忽略一些特定的异常
|
*/
|
private static final List EXCLUDE_EXCEPTION = new ArrayList(Arrays.asList("java.io.IOException: Broken pipe"));
|
|
|
|
@Override
|
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
|
Exception ex) {
|
ModelAndView model = new ModelAndView();
|
FastJsonJsonView view = new FastJsonJsonView();
|
Map<String, Object> attr = new HashMap<>(10);
|
|
if (ex instanceof GlobleException) {
|
// 如果是内部全局异常
|
LogUtil.warn("#程序抛出全局异常#", ex);
|
GlobleException globleException = (GlobleException) ex;
|
attr.put("status", globleException.getErrorCode());
|
attr.put("info", globleException.getMessage());
|
|
} else {
|
|
// 非内部异常
|
LogUtil.error("#程序抛出未捕获异常#", ex);
|
attr.put("status", 999999);
|
attr.put("info", InternationaUtil.getMesssge(SystemErrorCode.SYSTEM_UNKNOW_ERROR));
|
// 发送异常信息到管理群
|
// 加上请求接口路径
|
String requestUrl = "";
|
if (null != request) {
|
requestUrl = WebUtil.getLocation();
|
}
|
sendNoticeToAdmin(ex, MdcUtil.getMdc(), requestUrl);
|
|
}
|
attr.put("MDC", MdcUtil.getMdc());
|
view.setAttributesMap(attr);
|
model.setView(view);
|
return model;
|
}
|
|
/**
|
* 发送异常信息到管理群
|
*
|
* @param ex
|
* @author JIANGYOUYAO
|
* @email 935090232@qq.com
|
* @date 2018年5月9日
|
*/
|
public static void sendNoticeToAdmin(Exception ex, String mdc, String requestUrl) {
|
|
String simpleMsg = ex.getMessage();
|
|
if (!EXCLUDE_EXCEPTION.contains(simpleMsg)) {
|
|
|
String isOpenDingdingExceptionNotice = PropertiesUtil.getString("is_open_exception_report");
|
String showExcptionUrl = PropertiesUtil.getString("showExcptionUrl");
|
|
|
if (isOpenDingdingExceptionNotice != null && TRUE.equals(isOpenDingdingExceptionNotice)) {
|
|
if (StringUtils.isNotBlank(simpleMsg) && simpleMsg.length() > 100) {
|
simpleMsg = simpleMsg.substring(0, 100);
|
}
|
ProjException p = new ProjException();
|
p.setCreateTime(new Date());
|
p.setMachine(ComputerTools.getHostName());
|
p.setErrorMsg(printStackTraceToString(ex));
|
p.setSimpleMsg(simpleMsg);
|
p.setMdc(mdc);
|
if(requestUrl!=null){
|
p.setCause(requestUrl);
|
SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
|
if (user != null) {
|
p.setOwner("异常操作人:" + user.getSuName() + "账号:" + user.getSuAccount());
|
}
|
}
|
|
ProjExceptionDao projExceptionDao = WebUtil.getApplicationContext().getBean(ProjExceptionDao.class);
|
projExceptionDao.insert(p);
|
|
LogUtil.info("上报异常通知");
|
String title = "hive在服务器:" + ComputerTools.getHostName() + "发生异常";
|
String content = "hive异常类型:" + ex.getClass().getName() + " 描述:" + simpleMsg;
|
DingDingRobotUtil.sendLink("https://oapi.dingtalk.com/robot/send?access_token=62bb902f0e3945f0ece31306b99abae043fc69a66da0ef04d89fd20bf58d88d8", content, title, "", "" + showExcptionUrl + "?id=" + p.getId());
|
|
|
}
|
}
|
|
}
|
|
|
/**
|
* 获取异常堆栈信息
|
*
|
* @param t
|
* @return
|
* @author JIANGYOUYAO
|
* @email 935090232@qq.com
|
* @date 2018年5月9日
|
*/
|
public static String printStackTraceToString(Throwable t) {
|
StringWriter sw = new StringWriter();
|
t.printStackTrace(new PrintWriter(sw, true));
|
return sw.getBuffer().toString();
|
}
|
|
}
|