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

Jakarta ee 跨WebLogic WorkManager线程共享事务(使用CommonJ),jakarta-ee,transactions,weblogic,weblogic-10.x,workmanagers,Jakarta Ee,Transactions,Weblogic,Weblogic 10.x,Workmanagers,我已经在我的实体bean上配置了工作管理器,我可以通过JNDI查找它们。更改背后的想法是对一些验证进行多线程处理,因为这可能很耗时,但这需要访问当前事务 根据我的测试,工作线程中似乎无法访问事务。我非常希望在我的工作线程中访问事务-我可以这样做吗 我希望做类似的事情,在调度工作时传递XID对象,这意味着它继承当前事务。WebLogic支持这一点吗 这就是我所做的: 我在weblogic ejb jar.xml中添加了一个工作管理器定义,如下所示: <work-manager>

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

根据我的测试,工作线程中似乎无法访问事务。我非常希望在我的工作线程中访问事务-我可以这样做吗

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

这就是我所做的:

我在
weblogic ejb jar.xml
中添加了一个工作管理器定义,如下所示:

  <work-manager>
    <name>wm/EJBWorkManager</name>
    <min-threads-constraint>
      <name>EJBWorkManager_MinThreadCount</name>
      <count>5</count>
    </min-threads-constraint>
  </work-manager>
然后在我的代码中,我查找了工作经理,并安排了一些要执行的工作

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 );
}

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

Oracle支持电话的官方文字:

不可能/不支持。JTA有一个单线程模型

一种情况下,多个线程可以参与一个单一的线程 事务是调用远程服务器的地方。遥控器 服务器被登记为子协调器。即使如此,整个流程 控件的类型是单线程的,因此将此模型扩展到本地池 一堆线不会给你买任何东西


仅供参考:CommonJ不是必备品,但这正是我目前正在使用的。
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 );
}
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