1. 程式人生 > >FastJson格式化Request對象導致的一次異常思考

FastJson格式化Request對象導致的一次異常思考

except cal 異常 sas started sta neu tee 最簡

一、問題描述:

近期,在環境中出現一個阻塞性的異常“nested exception is java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)”。

二、問題影響:

影響了日工作的正常工作進度;

阻塞的關鍵點異常在捕獲後被吃掉,未正確打印出來,影響了排查問題的方向。重新打印異常棧後,定位到問題並解決,恢復正常的工作進程。

三、問題復現過程:

使用JUnit做一個最簡單的單元測試,直接Json.from(request)

四、問題分析:

FastJson是根據bean的get/set方法做反射解析的,當遇到Servlet3規範時(Servlet2.5是否會存在還沒驗證),恰好存在一個getAsyncContext()方法,內部的判斷邏輯是servlet異步模式為false,直接拋出IllegalStateException,導致此種尷尬的異常出現,進而阻塞了工作的進程。

五、問題引發的思考:

1.有沒有必要直接打印框架的一些形參,比如Servlet的Request/Response,MQ的onMessage的方法形參,還有HttpClient的Response/ClosableResponse;

直接打印MQ的onMessage的方法形參,看到的是一些二進制數組,沒有可讀性;

直接打印HttpClient的Response/ClosableResponse,看到的是一些不可讀的數據;

直接打印Servlet的Request.getRequestURI,會增加更多的磁盤IO;

2.是否可以考慮打印其中的業務參數,而不是那些比較貼近TCP發送/響應的請求,更多的打印應用層面的業務請求參數和響應結果;

FastJson格式化Request對象導致的一次異常思考