2013年11月21日 星期四

WADL:描述網站的 REST 介面的文件

WADL 是 Jersey 會自動產生出來的文件,可以從文件中看到每個 REST 介面使用的 method、接受的資料類型、介面的操作網址等等。

網址是 http://<host_name>/<project_name>/<prefix>/application.wadl
其中 HOST_NAME 是網站的網域名稱、PROJECT_NAME 是專案名稱、PREFIX 是在 web.xml 裡面定義的 REST 介面的入口。

參考資料:
1、Chapter 15. WADL Support

2013年11月14日 星期四

攔截 JVM 關閉的事件

某些程式碼想要在 JVM 關閉時處理,比如說釋放某些外部資源等等的
可以利用 Runtime 類別的 addShutdownHook() 方法,把要在 JVM 關閉時執行的程式碼加進去。

根據 Java 7 的官方文件顯示,會觸發 shutdown hook 的事件有以下兩種:
1. The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or
2. The virtual machine is terminated in response to a user interrupt, such as typing ^C, or a system-wide event, such as user logoff or system shutdown.

只要是任意一種事件被觸發,shutdown hook 上被註冊過的執行緒就會全部一起被觸發 start()
需要注意的是,全部一起被觸發指的當然還是一個一個觸發,但 JVM 不保證觸發的順序
另外也不會等一個執行緒執行完畢才繼續觸發下一個,而是一口氣觸發所有的執行緒,讓它們一起開始執行。

使用方法就單純產生一個 Thread 物件,然後呼叫 Runtime.addShutdownHook(java.lang.Thread) 就好了。

參考資料:
1、Runtime.html#addShutdownHook(java.lang.Thread)

2013年11月5日 星期二

觀察 GC 的狀況

-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC

參考資料:
1、Re: Problem with mongo 2.2.0 and java connection

2013年10月17日 星期四

筆記

Runtime-polymorphism
http://blog.sanaulla.info/2013/05/14/runtime-polymorphism-in-java/

sub class 繼承 super class 後,sub class 的 constructor 一定要呼叫某一個 super class 的 constructor
若沒有宣告任何 super(...) 時,預設將呼叫 super class 中沒有參數的 constructor
若 super class 所有定義的 constructor 皆有參數,會拋出 compilation error: Implicit super constructor XXXX() is undefined. Must explicitly invoke another constructor

2013年10月14日 星期一

攔截 Jersey 的 Exception 時略過 Jersey 自身吐出的 Exception

如果在使用 ExceptionMapper 時,攔截了所有的 RuntimeException 的話,預設會連 Jersey 吐的 WebApplicationException 一起攔截
因此會導致像是透過 GET 去存取應該用 POST 存取的 URL 時,應該要吐的 405 Method Not Allowed 一起被攔截並轉成指定的 Response 了。
而單獨略過 WebApplicationException 的方法可以參考 [1]。

2013年10月11日 星期五

使用 Jersey + Multi-part 接受檔案上傳

基本參考對象是 [6] 的範例,因為 Jersey 基本上已經做完大部分的事情,所以程式碼其實很簡單
不過在佈署 Jersey 時可能會有一些奇怪的問題~

2013年10月9日 星期三

在 HTTP header 放入特殊字元或文字

在正常的 HTTP header 中,依據 [1] 的回應,RFC 2616 文件中有以下的描述。
Words of *TEXT MAY contain characters from character sets other than ISO-8859-1 [22] only when encoded according to the rules of RFC 2047 [14].
因此 HTTP header 在不使用編碼的情況下,預設是以 ISO-8859-1 編碼。
而要放入 ISO-8859-1 不支援的字元時,必須使用 MIME 編碼才行。

解決在 eclipse 輸入中文會變亂碼

在 Windows 7(或 Windows XP)底下,直接從 eclipse 執行內含使用 Scanner 的程式
要接受使用者輸入時,會發現輸入的字串直接輸出都會是亂碼~
其實問題本身是系統編碼跟環境編碼不一致的問題。
因為 Windows 7(或 Windows XP)在繁體中文的環境中預設使用的編碼是 Big5
但是 eclipse 預設的編碼是 UTF-8,因此會發生 eclipse 使用 UTF-8 去編碼實際上是 Big5 的字元,就會變成亂碼了。