如何在Weblogic的全局事务执行多线程操作 - 编程入门网
如何在Weblogic的全局事务执行多线程操作时间:2010-12-24 BlogJava 走走停停又三年今天有人提出了一个诡异的要求,要求在全局事务中执行多线程操作。他们 全局事务中涉及两个数据库中的多个表,如果单线程那么走完,相应时间上不满 足要求,说白了就是比较慢,于是提出了这样的要求。从JTA的规范来看, transaction(TX)和thread是密切相关的,TX一般是不能在应用线程间传递的, 即我主线程起一个全局事务,然后我把这个事务传递给其他我新起的线程,单纯 的变量传递没问题,但这个事务是不能被transaction manager(TM)识别的,TM 对TX的管理有他自己的方式。从weblogic的实现来看,TX被放在当前线程的 threadlocal中,普通应用线程不存在这样的结构,所以简单的变量传递,对于 TM而言是没有意义的。那么到底有没有方法实现上面的需求的,我做了些测试, 使用weblogic内部的一些API可以实现这个需求。下面我们就来看看实现中的几 个要点: :) 1:上面说了,简单的变量传递对于weblogic的TM是没有意义的。TM判断事务 上下文(transaction context)的时候,会从当前线程的threadlocal检查,如果 没有,则说明当前线程没有和任何TX关联。那么我们如何将我们手里的TX放入当 前线程的threadlocal呢? weblogic的ExecuteThread是我们需要的那种线程, 但它是final的,我们不能继承它,只能继承它的父类了,也就是 weblogic.kernel.AuditableThread。 2:我们有继承了AuditableThread,那么我们怎么把TX放入它的threadlocal 中呢?这个可以通过weblogic的TM实现中的一些API来实现,具体到这个类就是 weblogic.transaction.internal.TransactionManagerImpl。比如 interResume(tx),internalSuspend()。由于这个API不是package protect的, 我们自己的类必须也位于weblogic.transaction.internal这个包中。 interResume(tx),用于将当前线程和指定的TX做关联,而internalSuspend()恰 恰相反,它用于解除这种关联。 3:因为涉及到多线程,主线程需要决定何时提交或回滚事务,这个我们要自 己要实现一个线程结果检查的方法(checkCompletion())。 下面就是我自己实现的测试代码,在Weblogic81测试没有问题。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |