0

我正在使用 jboss 5.1.0.GA (build: SVNTag=JBoss_5_1_0_GA date=200905221634)。并且需要获取bean的业务接口。这是事务管理所必需的。所以我有:

@Local
public interface MyBeanInterface {
    void transactionalMethod();
}

@Stateless
public class MyBean implements MyBeanInterface {
    @Resource
    private SessionContext context;

    private int aState;

    public void someMethod() {
        aState = 42;
        context.getBusinessObject(MyBeanInterface.class).transactionalMethod();
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void transactionalMethod() {
        System.out.println(aState); // 0!!!!!
    }
}

出于某种原因,我没有得到相同的 bean,但是创建了新的 bean。这是灾难性的,因为transactionalMethod需要状态变量值才能正确执行。

我在做什么错,或者那是jboss的错误?顺便说一句,有一个错误会影响通过 bean 的类获取业务对象的能力:https ://issues.jboss.org/browse/EJBTHREE-2126 。但是不确定它是否与我的问题有关。

4

2 回答 2

1

最好的解决方案是这样的:

@Stateless
public class MyBean implements MyBeanInterface {

    @Resource private TransactionManager tm;

    private int aState;

    public void someMethod() {
        aState = 42;

        Transaction transaction = tm.suspend();

        transactionalMethod();

        tm.resume(transaction);
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void transactionalMethod() {
        System.out.println(aState); // 0!!!!!
    }
}

当您从同一个实例调用已发布的接口方法时,通过 ejb 上下文传递,资源为:

  • 如果是@Stateless,则创建一个新实例。
  • 如果是@Stateful,则为第一次调用创建一个新会话,然后其他调用与@Singleton 相同。
  • 如果是@Singleton,则调用者等待资源被释放,如果它调用自己,则会创建死锁。如果方法带有@Read 注释,则调用自己不会产生任何死锁。
于 2020-11-10T16:06:49.437 回答
0

我没有时间查看语法是否完美,但您可以尝试:

InitialContext jndiContext = new InitialContext();
Object ref = jndiContext.lookup("projname/MyBeanInterface/local");
MyBeanInterfaceLocal m = (MyBeanInterfaceLocal) ref;

但是我看到你有一个 SessionContext 字段,所以也许对你来说代码应该有点不同。也许会是:

Object ref = SessionContext.lookup("projname/MyBeanInterface/local");
MyBeanInterfaceLocal m = (MyBeanInterfaceLocal) ref;

让我知道这是否有帮助!

于 2013-01-28T01:13:27.327 回答