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