首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨WebLogic WorkManager线程共享事务(使用CommonJ)

跨WebLogic WorkManager线程共享事务(使用CommonJ)
EN

Stack Overflow用户
提问于 2012-11-30 11:31:57
回答 1查看 1.7K关注 0票数 3

我已经在通过JNDI查找的实体bean上配置了工作经理。更改背后的想法是多线程一些验证,因为它可能很费时,但这需要访问当前事务。

从我的测试来看,事务在工作线程中是不可访问的。我非常想在我的工作线程中访问事务--我可以这样做吗?

我希望做一些类似于这个ExecutionContext的事情,在调度工作时传递XID对象,这意味着它继承了当前事务。WebLogic支持这个吗?

这就是我所做的:

我在weblogic-ejb-jar.xml中添加了一个工作经理定义如下:

代码语言:javascript
复制
  <work-manager>
    <name>wm/EJBWorkManager</name>
    <min-threads-constraint>
      <name>EJBWorkManager_MinThreadCount</name>
      <count>5</count>
    </min-threads-constraint>
  </work-manager>

ejb-jar.xml中添加了对bean定义的引用

代码语言:javascript
复制
  <resource-ref>
    <description>Work Manager allows multi-threading of defined units of work.</description>
    <res-ref-name>wm/EJBWorkManager</res-ref-name>
    <res-type>commonj.work.WorkManager</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

然后,在我的代码中,我查找了Work,并安排了一些要执行的工作。

代码语言:javascript
复制
weblogic.transaction.Transaction tx = ( weblogic.transaction.Transaction ) weblogic.transaction.TransactionHelper.getTransactionHelper().getTransaction();
log.info( tx != null ? tx.getXid().toString() : "No Transaction" );
try {
  InitialContext initialContext = new InitialContext();
  WorkManager workManager = ( WorkManager ) initialContext.lookup( "java:comp/env/wm/EJBWorkManager" );
  List<WorkItem> workItems = new ArrayList<WorkItem>(); 
  for ( int i = 0; i < 2; i++ ) {
    Work work = new Work() {
      public void run() {
        weblogic.transaction.Transaction tx = ( weblogic.transaction.Transaction ) weblogic.transaction.TransactionHelper.getTransactionHelper().getTransaction();
        log.info( tx != null ? tx.getXid().toString() : "No Transaction" );
      }
      public boolean isDaemon() {
        return false;
      }
      public void release() {
      }
    };
    workItems.add( workManager.schedule( work ) );
  }
  workManager.waitForAll( workItems, WorkManager.INDEFINITE );
} catch ( NamingException e ) {
  throw new RemoteException( "Error", e );
} catch ( IllegalArgumentException e ) {
  throw new RemoteException( "Error", e );
} catch ( InterruptedException e ) {
  throw new RemoteException( "Error", e );
} catch ( WorkException e ) {
  throw new RemoteException( "Error", e );
}

我得到的输出如下所示,这表明事务在生成的线程中不可用。是否可以将此事务共享到工作线程中?我认为他们是作为JCA1.5 (JSR 112)的一部分这样做的。

代码语言:javascript
复制
16 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] INFO com.tracegroup.isys.weblogic.beans.session.SimpleEJB - BEA1-0474BACB4707C088B359
16 [[STANDBY] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)'] INFO com.tracegroup.isys.weblogic.beans.session.SimpleEJB - No Transaction
16 [[STANDBY] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)'] INFO com.tracegroup.isys.weblogic.beans.session.SimpleEJB - No Transaction

编辑:我也尝试过使用weblogic.connector.work.WorkManager & javax.resource.spi.work.WorkManager,但是在执行JNDI查找时这些都没有被返回。这似乎确实允许将ExecutionContext传递给工作经理,从而允许给出XID。我对这些类的初步测试似乎不起作用。也许我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-06 15:51:34

支持调用的官方消息:

不可能/不支持。JTA只有一个线程模型。 在单个事务中可以涉及多个线程的一种情况是调用远程服务器。远程服务器被登记为子协调器。即使这样,整个控制流也是单线程的,因此将该模型扩展到本地线程池不会为您购买任何东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13644432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档