我已经在我通过JNDI查找的实体bean上配置了工作管理器。改变背后的想法是多线程一些验证,因为它可能很耗时,但这需要访问当前的事务。
从我的测试中看来,工作线程中无法访问事务。我非常想在我的工作线程中访问该事务 - 我可以这样做吗?
我希望做一些与此ExecutionContext类似的事情,其中在安排工作时传递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>
在ejb-jar.xml
<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>
然后在我的代码中,我查找了工作管理器并安排了一些工作来执行。
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 );
}
我得到的输出如下所示,表明事务在生成的线程中不可用。是否可以将此事务共享到工作线程中?我认为他们已经将此作为JCA 1.5(JSR 112)的一部分。
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&amp; javax.resource.spi.work.WorkManager也可以,但是在执行JNDI查找时无法返回这些内容。这些似乎允许将ExecutionContext传递给工作管理器,允许给出XID。我对这些类的初步测试似乎不起作用。也许我错过了什么?
答案 0 :(得分:3)
来自Oracle支持电话的官方消息:
不可能/不支持。 JTA有一个单线程模型。
一个案例,其中多个线程可以涉及单个线程 事务是呼叫远程服务器的地方。遥控器 服务器作为子协调员登记。即便如此,整体流程 控制是单线程的,因此将此模型扩展到本地池 线程不会给你买任何东西。