切換語言為:簡體
Java 執行緒中包含編譯錯誤程序會退出嗎?

Java 執行緒中包含編譯錯誤程序會退出嗎?

  • 爱糖宝
  • 2024-07-04
  • 2056
  • 0
  • 0

背景

總結最近遇到的一些簡單問題:

  1. Java 應用的某個執行緒,如果執行時依賴的 jar 不滿足,執行緒是否會退出?程序是否會退出?

  2. Netty 實現 TCP 功能時,換行符到底用的是什麼呢?

  3. 表結構設計時,預留擴充套件欄位的好處。

  4. 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 執行緒中包含編譯錯誤程序會退出嗎? 

專案實踐發現,Java 的 Kafka 客戶端,client 3.4.0 幾乎可以相容 2.x 的 Server 端。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.