對于中小型的應用tomcat作為服務器就足夠了,但是,在我把框架往tomcat上轉移的時候有了一個問題,工作流引擎的數據庫是獨立的,如何保證他和業務的數據庫事務上的統一性,這里就涉及到分布式事務的概念。
像weblogic,websphere,這種企業級服務器,他們有自己的事務管理器,你可以配置多個datasource,這些datasource可以指向不同的資源(數據庫,消息服務),事務管理器就是這些資源的管理中心,當一個事務開始的時候(begin),事務管理器會記錄并監視這個事務涉及的所有可管理資源,當一個事務結束的時候(commit),他會把所有的資源提交,而當程序出現異常的時候,他會把所有的資源回滾(rollback)。在事務邊界以內,所有的可管理資源實際都是沒有提交的,處于一種等待狀態,只有當事務提交的時候,事務管理器才負責把它所管理的所有資源提交。事務管理器就是一個全局事務管理中心,它負責把許多可管理(可以控制事務)的資源的事務統一起來。
出于這種這種考慮,我在管理全局性事務的時候,選擇了jtom和xapool。
Jotm是一個開源的JTA實現,是由ObjectWeb組織開發的,實際就是實現了事務管理器的功能,而且他還支持分布式事務,如果把jotm結合JORAM (也是由ObjectWeb組織開發的JMS實現)使用,就可以實現JMS的事務管理。(這里我在想,JBossCache是支持事務的cache,如果把它們結合在一起,是不是就可以對緩存進行事務控制了:))
對于jotm的使用,你只要記住這個應用中只有一個Jotm對象就OK了,對于分布式事務也是一樣,如何保證一個應用中只用一個Jotm實例呢?
jotmCurrent = Current.getCurrent();
使用上面的方法,如果jotmCurrent 等于null,說明現在的jvm中沒有沒有jotm實例,當需要分布式的時候就不能這么判斷了,你必須把jotm對象放到jndi上,以后使用的時候從jndi上取就可以了。
如果jotmCurrent不等于空,說明jvm中已經有jotm實例了,而如何得到這個實例了,如果從這個角度去考慮,是不行的,你可以看一下Jotm的API,看一下Current的類說明:
http://jotm.objectweb.org/current/jotm/jdoc/
public class Current
extends Object
implements UserTransaction, TransactionManager, Referenceable, Serializable
Current 對象實際就是一個事務管理器,哈哈,我們使用jotm,不就是為了這個嗎,ok,you got it!
我對jotm和事務的研究還不夠深入,以上都是個人理解,有不對的地方還請大家指出!
下面的文章,我重點對xapool進行說明(使用他的時候問題特別多:))