是否可以在远程EJB中使用TransactionManagementType.CONTAINER?

时间:2017-11-30 07:04:24

标签: java-ee transactions glassfish ejb corba

是否可以在远程EJB实现中使用TransactionManagementType.CONTAINER而不是TransactionManagementType.BEAN

为了进一步说明,我不想在我的业务层中处理beginroolback方法,但我没有找到另一种方法来使其工作。

我使用Glassfish 5和corbaname:iiop协议来访问我的远程EJB。

使用示例:

此代码块在我的服务器上运行:

package br.com;
@Remote
interface IRemote {void method();}

@Stateless
@TransactionManagement(value = TransactionManagementType.BEAN)
class Remote implements IRemote { 
@Resource
private UserTransaction ut;

void method(){
    try{
        ut.begin();
        <my business logic>
        ut.commit();
    }
    catch(Exception e){...}
}

此代码块在我本地计算机上的应用程序中运行:

@Stateless
class LocalBean {
    @EJB(mappedName = "corbaname:iiop:myserver.com:3700#java:global/RemoteApp/Remote!br.com.IRemote"
    private IRemote remote;
} 

我跟踪了来自Oracle的package website,但它使用TransactionManagementType.BEAN而没有任何解释。

有没有其他方法可以在不需要上述交易的情况下执行此操作?

3 个答案:

答案 0 :(得分:0)

查看容器管理的交易

  

RequiresNew Attribute如果客户端在事务中运行   并调用企业bean的方法,容器接受   以下步骤:

     

暂停客户的交易

     

开始新交易

     

委托调用方法

     

方法完成后恢复客户端的事务

     

如果客户端未与事务关联,则为容器   在运行方法之前启动一个新事务。

     

如果要确保,请使用RequiresNew属性   该方法始终在新事务中运行。

https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html

答案 1 :(得分:0)

默认情况下(来自EJB规范)会话bean使用ContainerManagedTransaction,如果没有注释,则使用Required。 这应该是远程或本地的。

你也可以明确地做到

@TransactionManagement(value = TransactionManagementType.CONTAINER)
@Required
public class MyBean ... {
   @Supported  // override class level annotaion
   public void method(...) {
   }
}

从上面的错误消息中我假设您尝试使用TMType.BEAN但是在方法中添加了@Required左右,这被容器抑制,因为不允许组合!

答案 2 :(得分:0)

您需要从远程bean中完全删除@TransactionManagement - 注释,然后默认为CMT。 UserTransaction的使用将是非法的。所以你必须删除它,但那就是重点,不是吗?

但请注意:您可能会创建远程事务,这意味着两个容器可能使用XA协议进行同步。如果您不希望这样,请将TransactionAttribute定义为TransactionAttributeType.REQUIRES_NEW,然后您将拥有与以前相同的行为,而无需明确的用户事务。