工作感想隨筆
公司的一個專案,沒有測試環境,所以沒法測試,只能直接放到正式環境。。。齊問我有沒有把握,我說沒有。。。我怎敢保證。事實也證明,確實沒把握。第一次推上線,是星期一上午,沒注意看readme檔案,沒把SocketClient類裡使用的埠號改過來,結果導致所有請求都沒得到響應,很快就收到客服那邊反饋的使用者投訴。星期二晚上十點第二次推上線,用裝置測試了一下基本操作,是可以的,可不到兩個小時,就又收到了投訴,只好把舊版本放回去。
回過頭來看看日誌,也沒找出問題所在。只能看到些莫名其妙的錯誤。很鬱悶。這使我不得不去懷疑,正在跑的程式的程式碼和我從gitlab上拷的是一樣的程式碼嗎?
我做的改動就是修改之前的日誌管理,即logger語句的寫法。除此之外,我還使用了ThreadLocal物件,我封裝了一個靜態的ThreadLocal物件,寫了set方法和get方法和release方法:
public class ThreadLocalUtils {
private static ThreadLocal<String> threadLocal = new ThreadLocal<String>();
public static void setToThreadLocal(String phone){
threadLocal.set(phone);
}
public static String getFromThreadLocal(){
return threadLocal.get();
}
public static void releaseInThreadLocal(){
threadLocal.remove();
}
}
然後,在service層方法執行了根據id去redis快取查詢相應資訊後,我將電話號碼通過set方法存到ThreadLocal物件中,然後在controller層當丟擲異常時,即在catch處通過get方法獲取電話號碼,最後在finally通過release方法釋放資源。使用ThreadLocal物件前也是有了解過的,應該是沒問題的吧?我在我的畢設作品上模擬了這個操作,是可以的。ThreadLocal物件以執行緒號為key,這樣是不會相互影響到才對啊,而且我也有釋放資源啊。
日誌中,奇怪的事情來了,當丟擲BusinessException異常時,第一個logger語句執行了,而後面的logger語句卻沒執行:
catch (BusinessException e) {
OutputObject outputObject = new OutputObject();
outputObject.error(e);
logger.error("捕獲BusinessException:" + outputObject);
//釘釘機器人通知部分
String tipMessage = "使用者uuid為"+ input.getUseruuid()
+ ",卡號" + input.getCardNo()
+ ",號碼" + ThreadLocalUtils.getFromThreadLocal()
+ ",在呼叫【/xxxx/xxxx】(訂單申請)時,結果提示:" + outputObject.getStatusCode()
+ "錯誤,錯誤資訊為:" + outputObject.getMessage() ;
SendMessageUtils.sendTextMessage(tipMessage);
logger.warn("<<<" + tipMessage);
return outputObject;
}
第一個logger語句執行了,第二個logger語句沒執行!!而且我呼叫釘釘通知的介面方法也沒有生效。我只能得出這樣的結論,這個get操作丟擲了異常:
ThreadLocalUtils.getFromThreadLocal()
也只能這樣解釋了。不然後面的logger語句怎麼會不執行?因為我的sendTextMessage方法是使用了try catch捕獲的,所以sendTextMessage方法肯定不是罪魁禍首。
可是我在我的畢設作品上也試著用這個ThreadLocal類,也是類似的操作,在service層裡set,在controller層的catch裡get,然後在finally裡release,卻是能正常執行的,釘釘上也收到了訊息!!!這真的讓我很不解。
真的想不懂,想不懂。到底是哪個環節出了問題。很認真很認真的和初始版本比較了,現在就真的只是改了日誌的輸出,沒有改到其他東西。明天再推上線,又出問題,我就真的真的真的真的不知道該怎麼辦了。抓狂。。。