문제
나는 무국적자 콩 다음과 같습니다.
@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 의 솔루션 기회를주고,따라서 시작 안 트랜잭션"의"가 됩니다.
이 옆에,나는 보지만 아무 솔루션을 구현하는 내부 프로세스()다른 빈도 못생긴 때문에 우리는 단순히 원하는 방 우리의 클래스 모델을 위한 이러한 기술 정보가 있습니다.