前一篇文章提到,我選用 ExecutorService 的主因是比較好控制 Thread
而控制的方法是把要產生的 Thread 都加入到我指定的一個 ThreadGroup
如此一來我只要用 ThreadGroup.activeCount() 就可以知道定時執行產生的 Thread 還有幾個正在執行
也可以用 Thread.enumerate(new Thread[ ]) 把 ThreadGroup 中的 Thread 列舉出來。
Software entities (class, modules, functions, etc.) should be open for extension, but closed for modification. Junior programmers create simple solutions to simple problems. Senior programmers create complex solutions to complex problems. Great programmers find simple solutions to complex problems. 註1:本部落格的範例程式碼在 2015 年以前的文章中,大多是以全型空白做縮排。如需服用,請自行用文字編輯器的取代功能把全型空白取代成半型空白。
- Bertrand Meyer
- Charles Connell
註2:本部落格的內容授權請參閱部落格底部的授權宣告。
2012年1月11日 星期三
Java 定時執行 (2):將 ExecutorService 產生的 Thread 加入 ThreadGroup
2011年12月16日 星期五
把 Session 寫入資料庫的方法:Session Persistent
目前的需求是要 web application 被重新 deploy 的時候,使用者必須能保留 session
原本在找用 session migration 把 session 遷移出去,deploy 完成後再遷移回來
不過後來找到比較簡單的方式,可以直接即時把 session 寫進資料庫
deploy 完成後 tomcat 會自動把 session 再抓出來。
2011年12月14日 星期三
Session migration
定義(來源:http://www.roseindia.net/interviewquestions/servlet/session-tracking.shtml):
Session Migration is a mechanism of moving the session from one server to another in case of server failure. Session Migration can be implemented by:
a) Persisting the session into database
b) Storing the session in-memory on multiple servers.
關鍵字:Session migration、Session replication、Cluster
相關資源:
1、Cluster:Tomcat 叢集設置
2、用terracotta達成tomcat session
3、How to integrate two web applications having two different context paths
後來發現我需要的不是 Session migration,而是 Session Persistent,所以這篇的資料整理就先停在這了。
2011年12月7日 星期三
字串切割遇到 "點" (period) 時會回應空陣列
參考資料:http://www.velocityreviews.com/forums/t139874-string-method-split-doesnt-work.html
如上述的連結回應所說,split() 函式裡面實際上用的是 regular expression
"." 在 regular expression 中是 metacharacter
所以必須改成以下的寫法才會有效果:
String string = "aaa.bbb";
String[] result = string.split("\\.");
2011年11月29日 星期二
Java 定時執行 (1)
Java 中要定時執行某個動作,有三種選擇:
1、Timer 和 TimerTask
2、ScheduledExecutorService
3、quartz 套件
原本我是用 1 的方法來實作定時執行,但後來遇到 Timer 的 thread 難以控制的問題
如果定時執行到一半突然必須強制關閉時,Timer 很難做到讓我找出它的 thread 並且關掉
在查了一些資料後看到這篇文章:Java Timer vs ExecutorService?
其中回應裡有一段「ScheduledThreadPoolExecutor can be configured with any number of threads. Furthermore, you have full control over created threads, if you want (by providing ThreadFactory)」
而 quartz 因為不明原因把網路上找到的 sample code 貼上去以後程式就爆了
而且有看到有文章說 ScheduledExecutorService 是比較底層的 API,雖然很多事情要自己做
但也因此能夠自己對 Thread 有比較完整的控制權
因此最後是決定改用 ScheduledExecutorService 來實作定時執行。
2011年11月16日 星期三
eclipse 更換不同編輯套件
在 eclipse 上安裝了 Aptana 套件,但是用 eclipse 開啟 html 或者 js 檔的時候
預設還是會用 eclipse 自己原生的 html editor
今天突然發現原來只要設定檔案關聯就好了!XD
Window → Preferences → General → Editors → File Associations
在上半部的框框中選擇要變更的副檔名
選定後下面的框框會列出可用的編輯器
可以把想要的編輯器設為預設(點右邊的 default),下次開啟時就會自動用指定的編輯器開啟了!
2011年11月4日 星期五
jQuery 讀取 JSONArray 的方法
一般透過 $.ajax 送 JSON 格式的資料給後端處理
後端回應一個 JSON 回來,都可以直接用 .xxx 來存取回應的 JSON
例如回應的 JSON 是 {"statuscode", 200}
可以直接用:
$.ajax({
type: "GET",
url: endpoint,
contentType: "application/json",
dataType: "json",
success: function(data){
consile.log("statuscode: " + data.statuscode);
},
error: function(){
unblock(); // TODO
}
});這樣在 FireFox 的 FireBug 中就會跑出:「statuscode: 200」的記錄。
當回應的 JSON 是個巢狀的 JSON array 時,則處理方式稍微複雜一點點
2011年10月29日 星期六
jQuery validate 套件:觸發驗證的事件
jQuery validate 預設的事件很奇妙
使用者按過一次 submit 觸發驗證以後,再回去改欄位內容
欄位內容就會每次 onChange 的時候都會觸發驗證
但因為有時候驗證是要送 AJAX 去給伺服器檢查
我們就不會很希望使用者每按一個鍵都會送一次 request
這樣當使用者一多的時候,或者是有人開機器人在亂按時
伺服器有可能會被這些訊息塞爆掉....
jQuery validate 套件的多國語言:更換 message 內容
在我們的專案中,由於語言資料已經寫在特定的檔案內
因此似乎不適用 jQuery validate 套件內建的 localization 方法
(我查到的資料好像都是說要把 message 寫在指定的 message.js 裡?)
要讓 error message 跟著使用者選取的語言更換,容易想到的可能作法有三種:
1、更換語言時讓整個網頁重新整理。
2、更換語言時把 validate 套件的 message dictionary 內容置換掉。
3、重新初始化 validate 套件。
其中 1 被主管打槍,主管要求我們不准重新整理網頁
2 找不到方法...(其中 disctionary 這個概念是搜尋時看到有人這麼說的,實際上我原本一直以為 validate 套件是需要時即時去讀字串的)
3 就是本篇的重點了~雖然是個笨一點的方法,但總是能夠做到效果....
2011年10月26日 星期三
Runtime.exec 容易發生的問題
最基本大概就是執行 Runtime.exec 實際上回傳的是 Process 物件
要用 InputStream 之類的物件接下來再轉成 String 才能顯示。
其他可能的問題可以參考下面的連結!
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html