錯誤日志里偶爾會有getOutputStream() has already been called for this response這個錯誤
最近發現了高概率復現條件,所以順手解決了一下:
首先根據這個錯誤關鍵信息,得知是錯誤產生原因是response.getWriter()和response.getOutputStream()等接口在調用時發生了資源占用
然而事實上在這個項目中並沒有使用response.getWriter()和response.getOutputStream(),那么就需要更深入的去查找錯誤的原因
首先高概率復現條件是在進行redis操作的時候,這兩個接口是進行流輸出的接口,根據關鍵字查找,從redis相關操作中發現了一行序列化操作有進行流相關的操作。
public static byte[] serialize(Object object) throws Exception { ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; try { // 序列化 baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(object); byte[] bytes = baos.toByteArray(); return bytes; } catch (Exception e) { throw e; } }
八成就是這里沒有close導致的bug了。再往深了看:
其中ByteArrayOutputStream用於捕獲內存緩沖區的數據,轉換成字節數組,但有趣的是對一個ByteArrayOutputStream進行close()操作沒有任何效果,而且這樣寫不會產生重復關閉導致的Exception。
ObjectOutputStream用於進行序列化,這個沒有close應該就是罪魁禍首了,但保險起見,還是兩個操作都加上Close()
修改后代碼如下:
public static byte[] serialize(Object object) throws Exception { ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; try { // 序列化 baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(object); byte[] bytes = baos.toByteArray();
oss.close(); baos.close(); return bytes; } catch (Exception e) { throw e; } finally { if(oos != null){ oos.close(); } if(baos != null){ baos.close(); } } }
問題解決!
https://www.cnblogs.com/Orange42/p/6168803.html