【Java項(xiàng)目】Spring-全局異常+釘釘推送(實(shí)現(xiàn)生產(chǎn)問(wèn)題監(jiān)控)

【Java項(xiàng)目】Spring-全局異常+釘釘推送(實(shí)現(xiàn)生產(chǎn)問(wèn)題監(jiān)控)
概述
生產(chǎn)環(huán)境的線上問(wèn)題,通常出現(xiàn)時(shí)都比較緊急,由于開(kāi)發(fā)人員不能直接debug生產(chǎn)環(huán)境,通常處理起來(lái)不是很容易。因此,生產(chǎn)環(huán)境出問(wèn)題時(shí),如果能夠?qū)?bào)錯(cuò)的接口和參數(shù),推送到釘釘群,就可以幫助技術(shù)人員快速排查生產(chǎn)問(wèn)題,避免對(duì)業(yè)務(wù)影響,出現(xiàn)生產(chǎn)事故。
這里結(jié)合Spring 全局異常和釘釘推送,介紹如何實(shí)現(xiàn)生產(chǎn)問(wèn)題監(jiān)控。
全局異常
Spring全局異常主要使用@ControllerAdvice 注解和@ExceptionHandler注解
@ControllerAdvice
該注解作用是給Controller控制器添加統(tǒng)一的操作或處理,結(jié)合@ExceptionHandler用于全局異常的處理,也可以使用@RestControllerAdvice以文本返回到瀏覽器,實(shí)際中該注解還有很多用途,這里不做深究,感興趣可以下來(lái)了解;
@ExceptionHandler
- 用來(lái)統(tǒng)一處理方法拋出的異常;
- +ExceptionHandler注解中可以添加參數(shù),參數(shù)是某個(gè)異常類的class,代表這個(gè)方法專門處理該類異常;
?@ExceptionHandler(NumberFormatException.class) ?public String handleExeption(Exception ex) { ??System.out.println("拋異常了:" + ex); ??ex.printStackTrace(); ??String resultStr = "異常:NumberFormatException"; ??return resultStr; ?}
此時(shí)注解的參數(shù)是NumberFormatException.class,表示只有方法拋出NumberFormatException時(shí),才會(huì)調(diào)用該方法。
- 如果是通過(guò)try catch處理了異常,將不會(huì)進(jìn)入到全局異常處理類,必須是通過(guò)運(yùn)行時(shí)拋出的異?;蛘呤峭ㄟ^(guò)throw new 加對(duì)應(yīng)的異常,才會(huì)進(jìn)入@ExceptionHandler 攔截。
配置過(guò)濾器
過(guò)濾器的作用,就是把httpServeletRequest包裝成ContentCachingRequestWrapper類型繼續(xù)往下傳。
?@Component ?public class RequestCachingFilter extends OncePerRequestFilter { ??@Override ??protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { ????filterChain.doFilter(new ContentCachingRequestWrapper(httpServletRequest), httpServletResponse); ??} ?}
第二步就是在使用的使用用方法getContentAsByteArray獲取入?yún)⒅担?/p>
?if(req != null && req instanceof ContentCachingRequestWrapper){ ????????ContentCachingRequestWrapper wrapper =(ContentCachingRequestWrapper) req; ????????log.error("request_body:{}", StringUtils.toEncodedString(wrapper.getContentAsByteArray(), Charset.forName(wrapper.getCharacterEncoding())) ????????); ??????}
這樣你就獲取到來(lái)自客戶端請(qǐng)求的入?yún)?。注意inputStream只能讀一次流就會(huì)被關(guān)閉,不會(huì)再被讀取,所以如果在序列化等過(guò)程中讀過(guò)一次inputStream,之后就不要嘗試自己再讀,會(huì)拋異常,無(wú)法讀取數(shù)據(jù)。
參考: https://blog.csdn.net/weixin_41953346/article/details/127882004
釘釘群消息推送
詳細(xì)的釘釘推送API可以參考地址:https://open.dingtalk.com/document/orgapp/custom-robot-access
釘釘群配置


總結(jié)
1、使用Spring 全局異常,可以對(duì)代碼異常信息進(jìn)行統(tǒng)一攔截;
2、使用釘釘推送,將異常信息及時(shí)推送到技術(shù)人員群里,及時(shí)反饋;
3、技術(shù)人員通過(guò)報(bào)錯(cuò)信息,監(jiān)控生產(chǎn)環(huán)境,也可以幫助高效解決問(wèn)題。
示例代碼github地址:
https://github.com/zhcyixin/zhc-java.git
歡迎大家下載,有問(wèn)題可以在評(píng)論區(qū)交流。