문제

나는 무국적자 콩 다음과 같습니다.

@Stateless
public class MyStatelessBean implements MyStatelessLocal, MyStatelessRemote {
    @PersistenceContext(unitName="myPC")
    private EntityManager mgr;

    @TransationAttribute(TransactionAttributeType.SUPPORTED)
    public void processObjects(List<Object> objs) {
        // this method just processes the data; no need for a transaction
        for(Object obj : objs) {
            this.process(obj);
        }
    }

    @TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void process(Object obj) {
        // do some work with obj that must be in the scope of a transaction

        this.mgr.merge(obj);
        // ...
        this.mgr.merge(obj);
        // ...
        this.mgr.flush();
    }
}

일반적으로 사용한 다음은 클라이언트는 전화 processObjects(...),지 않는 실제로 상호 작용체 관리자입니다.그것은 그것이 무엇이 필요하고 전화 과정(...)에 대해 개별적으로 각 개체하는 과정입니다.기간의 과정(...)이 상대적으로 짧은,하지만 processObjects(...)수있는 매우 오랜 시간이 걸릴를 통해 실행하는 모든 것입니다.그러므로 나는 그것을 원하지 않을 유지하는 열린 트랜잭션이 있습니다.나 필요한 개인 과정(...)작업을 운영하에서 자신의 트랜잭션이 있습니다.이 새로운 트랜잭션에 대한 모든다.마지막으로 나가고 싶은 옵션을 유지하기 위해 열려하여 클라이언트는 전화 과정(...)이 직접 있습니다.

나의 거래 유형:결코,지원하지 않는 지원(에 processObjects)고 필요한 새로운(에서 프로세스)지만 TransactionRequiredException 마 병합()를 호출합니다.

나는 그것을 만들 수 있는 작업으로 분리하는 방법으로 두 개의 서로 다른 콩:

@Stateless
@TransationAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyStatelessBean1 implements MyStatelessLocal1, MyStatelessRemote1 {
    @EJB
    private MyStatelessBean2 myBean2;

    public void processObjects(List<Object> objs) {
        // this method just processes the data; no need for a transaction
        for(Object obj : objs) {
            this.myBean2.process(obj);
        }
    }
}

@Stateless
public class MyStatelessBean2 implements MyStatelessLocal2, MyStatelessRemote2 {
    @PersistenceContext(unitName="myPC")
    private EntityManager mgr;

    @TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void process(Object obj) {
        // do some work with obj that must be in the scope of a transaction

        this.mgr.merge(obj);
        // ...
        this.mgr.merge(obj);
        // ...
        this.mgr.flush();
    }
}

하지만 나는 아직도 호기심이 가능하다면 이를 위해서 하나의 클래스가 있습니다.그것처럼 내게 보이는 트랜잭션 관리자만 작동에서 빈 수준을 때에도 개별적인 방법은 주어진 더 보시려할 수 있습니다.그렇다면 표시 방법 중 하나로서 방법을 방지하는 트랜잭션에서 호출을 시작 다른 방법을 이내에는 동일한 인스턴스도를 만들지 않는 트랜잭션,상관 없이 그들이 어떻게 표시되는가?

내가 사용하는 JBoss Application Server4.2.1.GA,하지만 비별 답변이 오신 것을 환영합니다/를 선호합니다.

도움이 되었습니까?

해결책

그것을 할 수있는 또 다른 방법은 실제로 두 방법 모두 같은 콩이지 @EJB 대한 참조 자체가!무언가가 다음과 같다:

// supposing processObjects defined on MyStatelessRemote1 and process defined on MyStatelessLocal1
@Stateless
@TransationAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyStatelessBean1 implements MyStatelessLocal1, MyStatelessRemote1 {
    @EJB
    private MyStatelessLocal1 myBean2;

    public void processObjects(List<Object> objs) {
        // this method just processes the data; no need for a transaction
        for(Object obj : objs) {
            this.myBean2.process(obj);
        }
    }


    @TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void process(Object obj) {
        // do some work with obj that must be in the scope of a transaction

        this.mgr.merge(obj);
        // ...
        this.mgr.merge(obj);
        // ...
        this.mgr.flush();
    }
}

이 방법은 실제로'힘'이 process() 방법을 통해 액세스 할 수 있 ejb 스택의 프록시,따라서 복용 @TransactionAttribute 효과에 여전히 유지하는 단 하나의 클래스입니다.휴!

다른 팁

트 이 질문을 묻은 고전적인 중 하나는,내가 생각하는 자 참조 솔루션을 Herval/파스칼은 깔끔합니다.더 일반 솔루션이 여기에 언급되지 않습니다.

이 경우 EJB"사용자"트랜잭션이 있습니다.이후 세션에서 콩을 얻을 수 있는 사용자 트랜잭션에서는 세션이다.여기는 당신의 코드는 보이는 것으로 사용자의 거래:

// supposing processObjects defined on MyStatelessRemote1 and process defined on MyStatelessLocal1
@Stateless
@TransationAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyStatelessBean1 implements MyStatelessLocal1, MyStatelessRemote1 {

    @Resource
    private SessionContext ctx;

    @EJB
    private MyStatelessLocal1 myBean2;

    public void processObjects(List<Object> objs) {
        // this method just processes the data; no need for a transaction
        for(Object obj : objs) {
            this.myBean2.process(obj);
        }
    }


    public void process(Object obj) {

        UserTransaction tx = ctx.getUserTransaction();

        tx.begin();

        // do some work with obj that must be in the scope of a transaction

        this.mgr.merge(obj);
        // ...
        this.mgr.merge(obj);
        // ...
        this.mgr.flush();

        tx.commit();
    }
}

내가 생각하는 것은 각 콩에 싸여 프록시를 제어하는 트랜잭션의 행동을 했다.를 호출할 때 하나에서 콩 다른 당신 통해는 빈의 프록시와의 거래 행위에 의해 변경 될 수 있습 proxy.

그러나 때 콩을 호출하는 방법에 자체와 다른 특성 트랜잭션,통화 가지 않는 프록시를 통해,그래서 행동 변경되지 않습니다.

매트 무엇을 위해,그것의 가치가 나왔을 정확히 같은 결론 당신 같습니다.

TransactionAttributeTypes 만 고려할 때 교차 콩니다.메서드를 호출할 경우에는 동일한 콩 TransactionAttributeTypes 없 효과 상관없이,어떤 종류에 넣어 방법이 있습니다.

로 볼 수 있습니다 거기에 아무것도 EJB 지속성 스펙을 지정하는 어떤 행동해야한 이러한 상황에서.

또한 저는 이것을 경험에서 Jboss.나 또한 그것을 시도하에서 Glassfish 알려의 결과입니다.

경우에 누군가가 이 일일:

순환 종속성이 발생하지 않도록(수 있도록 자체에 대한 참조를 들어)에서는 JBoss 를 사용하여 주석'IgnoreDependency'예를 들어:

@IgnoreDependency @EJB 자신 myselfRef;

나는 아직 시도하지 않은(나)하지만 대안을 주사 자체 참조를 통해 @EJB 주석은 SessionContext.getBusinessObject() 방법입니다.이것이 또 다른 방법이 될 가능성을 피하기 위하여 순환을 참조건에서 당신은-하지만 적어도에 대한 무 콩 주입을 작동하는 것을 보인다.

에서 일하고 있어요 큰 시스템에서는 모두 기술을 채용하고(아마도 서로 다른 개발자),그러나 나는 확실하지 않다는"올바른"그것을 할 수있는 방법입니다.

내 생각으로 할 수 있다 @TransationAttribute(TransactionAttributeType.지 않) 에서 방법 processObjects.

TransactionAttributeType.지

http://docs.sun.com/app/docs/doc/819-3669/6n5sg7cm3?a=view

는 경우 클라이언트가 실행 중인 내에서 트랜잭션과를 호출하는 기업 콩 방법,컨테이너가 발생 RemoteException.클라이언트가 아닐 경우 와 관련된 트랜잭션 컨테이너 시작하지 않 new 트랜잭션하기 전에 실행하는 방법입니다.

나는 가정이고 있는 클라이언트 방법 processObjects 클라이언트의 코드입니다.기 때문에 아마도 당신의 클라이언트와 연결되지 않은 트랜잭션의 방법으로 통화 TransactionAttributeType.지 이 행복에서 첫 번째 장소입니다.당신은 전화 프로세스 에서 방법 processObjects 는 비록을 가지는 TransactionAttributeType.필수 주석은 아니었 콩 메소드 호출 및 거래 정책이 적용되지 않습니다.를 호출할 때 병합 당신이 얻을 제외하기 때문에 당신은 여전히 연결되지 않는 트랜잭션이 있습니다.

을 사용하여 시험 TransactionAttributeType.필수 모두 콩 방법을 보면 속임수를 않습니다.

나는 이러한 원형 종속성의 문제는 케빈이 한다.그러나,주석 제안@IgnoreDependency 는 jboss-특정 주석이 없에 대응 e.g Glassfish.

이후 그것은 작동하지 않는 기본 EJB 참조,느낌이 조금 불편하게 이 솔루션입니다.

따라서,나는 bluecarbon 의 솔루션 기회를주고,따라서 시작 안 트랜잭션"의"가 됩니다.

이 옆에,나는 보지만 아무 솔루션을 구현하는 내부 프로세스()다른 빈도 못생긴 때문에 우리는 단순히 원하는 방 우리의 클래스 모델을 위한 이러한 기술 정보가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top