Google Prettify

2008-01-22

如何在Quartz中確定當上一個job尚未執行完前不執行下一次job?

為了避免重覆執行企業邏輯,我們在排程時有時必須確保上一次的工作執行完後,才可以允許下一個排程工作繼續執行。也就是說,原則上是個一個固定時間區間執行一次企業邏輯運算,但實際上必須等到上一次運算完後,才可以繼續執行下一次的運算...當然,也是要在固定時間區間之後。以下是個人撰寫的部份sample code。主要是利用Scheduler.getCurrentlyExecutingJobs()來限制執行job的數量。其實原理並不是不執行排程,只是不執行排程裡設定的動作。

Sample code後有一段是展示如何重新啟動排程及設定排程時間。

這段Sample code是使用Spring framework。

public class LogAnalysisJob extends QuartzJobBean {
    private LogAnalysisBO bo;

    public void setBo(MyBO bo) {
        this.bo = bo;
    }

    protected void executeInternal(JobExecutionContext c)
    throws JobExecutionException {
    Scheduler sc = c.getScheduler();
    try {
      List l = sc.getCurrentlyExecutingJobs();
      if (l.size() <= 1) { //限定目前的只有1個bo被執行
      bo.exe();//真正執行企業邏輯的部份
    }
    SimpleTriggerBean t = (SimpleTriggerBean) c.getTrigger();
    if (count > 10) {
       t.setRepeatInterval(t.getRepeatInterval() + 3000);//如果排程執行超過10次, 每次執行間隔就延長3秒
       sc.rescheduleJob(t.getName(), c.getJobDetail().getGroup(), t);
       count = 0;
    }
    count++;
  } catch (SchedulerException e) {
    e.printStackTrace();
  }

    private static int count;
}

2008-01-21

在Spring中使用Quartz

最近工作上同時使用了spring framework與quartz排程。其實這個solution在網路上已經有很多了,甚至是copy-paust良葛格的sample code也可以直接用。當然會記在這裡,一定是遇到了一些難以解決的問題。
當我在執行時,發生了NoSuchMethodError
Caused by:java.lang.NoSuchMethodError:org.apache.commons.collections.SetUtils.orderedSet...
解決方法是更換commons-collections至3.X版就可以了。

2008-01-04

Hibernate中Criteria如何查詢nested property?

假設我們有一個Object A。A的型態是ObjectA,A有一個property名稱是 propertyA、類型是ObjectB。ObjectB中有一個property名稱是propertyB屬性是String。注意、問題來了:要怎麼使用Hibernate criteria去取得propertyB值是"nested property"的instance A呢?一般人都會直覺的認為

Criteria cri = session.createCriteria(ObjectA.class);
cri.add(Restrictions.eq("propertyA.propertyB", "nested property"));
Collection r = cri.list();

這樣是不行滴。(其中一個)正確的寫法是:

Criteria cri = session.createCriteria(ObjectA.class);
cri.createAlias("propertyA", "ptA");
cri.add(Restrictions.eq("ptA.propertyB", "nested property"));
Collection r = cri.list();

沒錯,跟HQL一樣,需要使用alias。
更多請參考:Hibernate 文件

2007-11-27

如何在weblogic 8.1中得知是否有發生connection leak?

        案子中使用的container是weblogic 8.1。最近工作上寫的系統,偶爾會發connetion leak。長官執疑什麼是connection leak? 在請教過google大神後,才在BEA的官網中找到一些資訊。
在weblogic 8.1中發生connection leak時會產生<BEA-001074>錯誤。那什麼叫connection leak? "BEA官方解釋是
A JDBC pool connection leak was detected. A connection leak occurs when a connection obtained from the pool was not closed explicitly by calling close() and then was disposed by the garbage collector and returned to the connection pool. A stack trace is printed indicating where the leaked connection was created...
如何知道那裡有發生connection leak呢?

首先要在 startup scripts (startWeblogic.cmd)中加入 -Dweblogic.Debug=weblogic.JDBCConn="true", weblogic.JTAJDBC="true"

另外要設定weblogic中domain的config.xml中的指定連線 ConnLeakProfilingEnabled屬性為true。

 <JDBCConnectionPool ConnLeakProfilingEnabled="true"
    ConnProfilingEnabled="true"
     DriverName="oracle.jdbc.OracleDriver"
     InactiveConnectionTimeoutSeconds="0" MaxCapacity="20"....

其實設定ConnLeakProfilingEnabled也可以透過weblogic console中設定。




其中Inactive Connection Timeout要設定為0

2007-11-21

清除IE中記住的帳號密碼


來說一個經驗吧。(咦? 這個開場白好像之前用過了...)

公司的網路使用single sing on,有設定Proxy,要求凡是要上網的員工都必須輸入帳號密碼。剛來公司時,因為公司網管還沒有設定好帳密(帳號密碼,簡稱帳密(誰說中文不可以有縮寫的...:D)),就拿了一個剛離職同事的帳密來用。也貪求方便勾選了「記憶密碼」這個選項,於是當使用IE上網時再也不會有輸入帳密這個煩人的對話框出現了。之後我的帳號雖然建立好了,可是還是持續使用離職同事的帳密,也都沒事。

故事並沒有完。當這個同事的帳號被移除後,因為它再也不會有輸入帳密這個對話框,就一直導到帳號鎖定的錯誤頁面。中間完全沒有機會輸入自己合法的帳密。最後只好使用終極(最爛)招式-重灌。

現在各位走運了。經過一番搜尋,終於有其他的方法了。

點選「控制台」->「使用者帳戶」,選擇使用者,「管理我的密碼」就可以去控制系統已經記住的帳密了。

2007-11-19

解決MyEclipse中無法連上Oracle的問題


在MyEclipse中依版本的不同,在使用DB Browser連向Oracle時,有些版本會出現ora-12705的問題。各位可以朝幾個方面來解決這個問題。
1.原來MyEclipse在Windows中預設的執行捷徑是:
C:\eclipse\eclipse.exe -vmargs -Duser.language=en
-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -Dosgi.splashLocation="C:\Program
Files\MyEclipse\eclipse\MyEclipseSplash.bmp"
必須要將它改成
C:\eclipse\eclipse.exe -vmargs -Duser.language=en_US
-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -Dosgi.splashLocation="C:\Program
Files\MyEclipse\eclipse\MyEclipseSplash.bmp"
這個問題的原因其實蠻明顯的:就是Oracle不認得en這個語言,Oracle DB只認識en_US這個語言。

2.而隨著版本的異動,有些版本已經解決掉這個問題了。各位可以直接下載all in one的package來試試看。不過在我的經驗裡,MyEclipse5雖然有解決掉這個問題,可是MyEclipse6這個問題又跑出來了~"~.
3.不然更換較新的oracle driver試試。在DB Browser中可以設定connection資訊。我的經驗中使用ojdbc10.2.0.3.0的jar檔可以解決這個問題。最近的Oracle Driver可以從這裡下載

您或許對這些有興趣

最後

謝謝您的閱讀,希望您可以有豐富的收獲。