2012年1月11日 星期三

Java 定時執行 (2):將 ExecutorService 產生的 Thread 加入 ThreadGroup

前一篇文章提到,我選用 ExecutorService 的主因是比較好控制 Thread
而控制的方法是把要產生的 Thread 都加入到我指定的一個 ThreadGroup
如此一來我只要用 ThreadGroup.activeCount() 就可以知道定時執行產生的 Thread 還有幾個正在執行
也可以用 Thread.enumerate(new Thread[ ]) 把 ThreadGroup 中的 Thread 列舉出來。

參考資料:How to use ThreadFactory in Java

2011年12月16日 星期五

把 Session 寫入資料庫的方法:Session Persistent

目前的需求是要 web application 被重新 deploy 的時候,使用者必須能保留 session
原本在找用 session migration 把 session 遷移出去,deploy 完成後再遷移回來
不過後來找到比較簡單的方式,可以直接即時把 session 寫進資料庫
deploy 完成後 tomcat 會自動把 session 再抓出來。

參考資料:Tomcat 6 Session Persistence through JDBCStore

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