2013年11月22日 星期五

使用 Jersey + Multi-part 接受檔案上傳(二):實作即時上傳

依照上篇文章(使用 Jersey + Multi-part 接受檔案上傳)的方法做 Multi-part 的上傳時
依據 Jersey 的實作方法,實際上會先在伺服器上把使用者上傳的檔案全部接收、暫存到暫存的資料夾內,然後才會進入使用者定義的 Multi-part 的介面,並獲得代表檔案內容的 FormDataMultiPart。
也就是說實際上如果檔案是要存到伺服器上,伺服器對這樣一個檔案上傳的動作,會花費兩次的磁碟 I/O 時間來接收和儲存這個檔案。

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 時可能會有一些奇怪的問題~