对于中小型的应用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进行说明(使用他的时候问题特别多:))