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