4

使用Ejb3.0、Weblogic 11g、JDBC

我正在调用在另一个部署 EAR 中远程运行的方法。

远程部署中的方法被调用,但它带有注释 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

问题是在调用远程方法之前我在数据库中执行的所有逻辑都不会提交,直到远程方法完成。

我愿意做的是承诺让“之前”逻辑发生“以及当我在远程调用后恢复正常继续时。

任何想法?

一些代码来解释:

@CallByReference
@Stateless(mappedName = "ejb/OperatorProccessBean")
@Local({ OperatorProccessBeanLocal.class })
@Remote({ OperatorProccessBeanRemote.class })
public class OperatorProccessBean implements OperatorProccessBeanLocal,  
 OperatorProccessBeanRemote
{   

...

   SBNDispatchBeanRemote SBNDispatchBean = (SBNDispatchBeanRemote) context.lookup("ejb/SBNDispatchBean#com.mirs.sbn.dispatch.SBNDispatchBeanRemote");
    if (SBNDispatchBean == null)
    {
            logger.error(TAG + " SBNDispatchBean is null");

    }
    else
    {
         //until here I want all my data to be commited without waiting for the upcoming remote method to finish
         SBNDispatchBean.updateSubscriberInBlockingList(...);
    }
...
 }

现在该方法updateSubscriberInBlockingList()注释为

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

我希望在调用该方法之前提交数据。

在此先感谢,雷。

4

2 回答 2

3

现在方法 updateSubscriberInBlockingList() 用 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 注释

我希望在调用该方法之前提交数据。

鉴于您正在使用容器管理的事务,这是不可能的。这背后的基本原理是,当容器已经在执行事务时,启动新事务将导致原来的事务被挂起。当新事务提交后,将恢复原来的事务。

此行为不可配置,因为 EJB 容器和 JTA 事务管理器应遵守 JTA 规范中指定的行为,该规范源自 X/Open DTP 事务模型。在 X/Open DTP 模型中,如果有一个新事务开始,而另一个事务正在进行,则当前事务将暂停,并在稍后的时间点恢复。应该注意的是,没有任何事务模型可能(我还没有研究过所有)允许提交当前事务并开始一个新事务。我只看到各种事务处理模型支持嵌套事务或暂停事务。

如果要提交工作,则必须完全终止现有事务上下文,以便现有事务将提交,然后启动新事务。

于 2011-06-14T11:42:19.623 回答
1

将“远程调用之前”逻辑放在一个单独的 bean 方法中,并用 REQUIRES_NEW 注释。因此,您将拥有三笔交易:

  • 一个用于主要方法(但在远程调用完成之前不会做任何事情);
  • 一个用于远程调用之前的逻辑;
  • 一个用于远程呼叫。
于 2011-06-14T11:45:29.677 回答