使用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)
我希望在调用该方法之前提交数据。
提前致谢, 射线。
答案 0 :(得分:2)
现在使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)注释方法updateSubscriberInBlockingList()
我希望在调用该方法之前提交数据。
鉴于您正在使用容器管理的事务,因此无法实现。这背后的基本原理是,当容器已经在执行事务时,启动新事务将导致原始事务被暂停。新事务提交后,原始事务将恢复。
此行为是不可配置的,因为EJB容器和JTA事务管理器应符合JTA规范中指定的行为,该行为源自X / Open DTP事务模型。在X / Open DTP模型中,如果启动了新事务,而另一个事务正在进行中,则当前事务将暂停,并在稍后的时间点恢复。应该注意的是,没有交易模型,可能(我没有全部研究过)允许提交当前交易并开始新交易。我只看到各种事务处理模型支持嵌套事务或挂起事务。
如果要提交工作,则必须完全终止现有事务上下文,以便现有事务提交,然后启动新事务。
答案 1 :(得分:1)
将“远程调用之前”逻辑放在另外用REQUIRES_NEW注释的bean方法中。因此,您将有三笔交易: