背景
總結最近遇到的一些簡單問題:
Java 應用的某個執行緒,如果執行時依賴的 jar 不滿足,執行緒是否會退出?程序是否會退出?
Netty 實現 TCP 功能時,換行符到底用的是什麼呢?
表結構設計時,預留擴充套件欄位的好處。
Kafka 相容矩陣彙總。
執行時編譯錯誤
開發過程中,本地測試時用環境會嚴格要求依賴的滿足,如果缺少依賴的 class 時,可能編譯都通不過。
但是,釋出到伺服器上的時候,外部依賴方式引用透過 -cp 類路徑
,如果對應依賴的包沒有設定到類路徑下時,應用會怎麼樣呢?
總結幾種情況如下:
1)啟動類依賴的 Jar 包缺失時,Java 應用啟動時會報錯,應用不會啟動。
2)程式中 Jar 包缺失時,如果是多執行緒環境,且依賴該包的類只在某個執行緒中被引用的,那麼它不會影響程式,程序不會退出的。
3)如果透過執行緒池提交任務,而任務依賴的包沒被滿足的話,這個任務會結束,但是執行緒池還在,程序還在。
4)程式執行過程中,行首的 import
語句的類找不到時,不會導致程式異常,甚至不會丟擲異常來。尤其是用執行緒池的時候,它的 run
方法即使用 try-catch
也不會捕獲到類不存在異常。
Netty 包解析換行符的作用
利用 Netty 自定義 TCP 請求解析時使用 channel.pipeline().addLast(new LineBasedFrameDecoder(65535));
時,那麼客戶端傳送資料必須使用換行符 \n
結尾才能被解析到。
確切地說,應該是用服務端作業系統的換行符,以下是客戶端傳送時的 demo ,必須以接收端的換行符結尾。
String line = System.getProperty("line.separator"); ByteBuffer buf = ByteBuffer.allocate(2048); // TODO. 待發送的資料 byte [] data = "".getBytes(); buf.put(data, 0, data.length); buf.put(line.getBytes());
DOM 元素 ID 命名及影響
使用 jQuery 操作 html 節點時,節點的 ID 中不能有 .
,否則會無法識別目標節點、操作無效。
建表預留擴充套件欄位
兩年前參與實現的一個模組,支援 N 種服務型別,N 最初只有 3 種,實現的時候說可能不確定。
兩年過去了,支援的服務擴充套件到了6種,還好當初建表的時候額外建立了6個 ext1.....6
的擴充套件欄位,需求變一點,用一個擴充套件欄位,今年4月竟然用完了6個擴充套件欄位,一直沒動過表結構。
建表時預留擴充套件欄位的意識來自從業的第一家企業,那時專案中幾乎每個表都有至少三個 ext 欄位。剛入行時比較單純,感覺這種設計思路很好,就一直記著。這麼多年,靠著面向百度開發和之前的技術積累,還能混到職場天花板的年紀,自己都有點不好意思了!
Kafka 相容矩陣
Kafka Server 的版本不確定,那麼編寫 Kafka 客戶端應用時,如何選擇 Kafka-client 版本呢?
在 Kafka 0.10.2.0 之前,Kafka 伺服器端和客戶端版本之間的相容性是“單向”的,即高版本的 broker 可以處理低版本 client 的請求。
反過來,低版本的 broker 不能處理高版本 client 的請求。由於升級client要遠比升級broker簡單得多,因此這個限制給很多使用者帶來了麻煩,甚至有很多人都不願意去升級broker版本——畢竟無downtime的情況下正確升級Kafka伺服器是個不小的挑戰。
自 0.10.2.0 版本開始,社羣對這個問題進行了最佳化,0.10.2.0 之後使用者可以簡單地升級client端程式碼到這個版本就可以很容易地實現與低版本Kafka伺服器的互動了。
專案實踐發現,Java 的 Kafka 客戶端,client 3.4.0 幾乎可以相容 2.x 的 Server 端。