2014-01-13 6 views
0

단일 진입 점 (메소드)이있는 Stateless EJB를 사용하여 웹 서비스를 개발 중입니다. 이 방법에는 3 단계가 있으며 1 단계는 2 단계와 3 단계 (동일한 트랜잭션에 있어야 함)와는 다른 트랜잭션에서 발생합니다. 이러한 "단계"는 주입 된 Stateless EJB에 대한 호출로 구성됩니다. 내가 몇 가지 코드로 설명하자EJB 트랜잭션

@Stateless 
@WebService(...) 
public class MyWebServiceImpl implements MyWebService { 

    @EJB 
    private UserBusinessBean userBusinessBean; 

    @EJB 
    private EventsBusinessBean eventsBusinessBean; 

    @WebMethod(...) 
    public MyWebServiceResult process(MyWebServiceParam param) { 
      // extract data from param 
      EventResult createEventResult = eventsBusinessBean.createEvent(data); // step 1 
      // do some extra processing 
      User user = userBusinessBean.createUser(someData); // step 2 
      // do some extra processing 
      EventResult updateEventResult = eventsBusinessBean.updateEvent(moreData); // step 3 
    } 
} 

는 2 EJB를가 상태 그 자체이며, 기능은 데이터베이스에 저장 프로 시저를 호출하는 것입니다 무국적의 DAO에 대한 참조를 주입했다 주입.

하나의 트랜잭션에서 1 단계를 실행하고 다른 트랜잭션에서 2 단계와 3 단계를 실행해야합니다 (2 단계 또는 3 단계가 실패하면 1 단계의 정보가 이미 커밋되어 있기 때문에).

컨테이너 관리자 트랜잭션 또는 사용자 관리 트랜잭션을 구현하는 두 가지 옵션이 있습니다. 전 접근 방식이 후자보다 더 안전하다고 생각합니다. 관리자를 컨테이너 (제 경우에는 Weblogic 서버)에 위임했습니다. 하지만이 논리를 구현하기 위해 EJB 트랜잭션 주석을 어떻게 사용해야하는지 이해할 수 없습니다. 주입 된 Business Beans의 메소드에 주석을 추가해야합니까? DAO는 어떨까요? 주석을 달 필요가 있습니까? 그리고 어떤 것들을 사용해야합니까?

이 도움말에서 나에게 도움을 주시기 바랍니다. 내 구현에 대한 자세한 내용을 알고 싶다면 알려주십시오.

답변

0

MyWebServiceImpl@Stateless이므로 암시 적으로 REQUIRED 트랜잭션 특성을 갖습니다. 1 단계가 자체 거래로 완료되도록하려면 EventsBusinessBean.createBean 메소드에 @TransactionAttribute(REQUIRES_NEW)을 추가해야합니다. 그러면 빈이 자체 트랜잭션으로 작성되고 process의 나머지 조치는 다른 트랜잭션 내에서 작동합니다.

+0

그게 문제를 해결했습니다. 내 웹 서비스 빈의 암시 적'REQUIRED' 속성을 잊어 버렸습니다. 트랜잭션을 롤백하기 위해'ApplicationException'을 던지면서 추가 작업을해야했습니다. 감사! – Baderous

+0

DAO의 경우 http://stackoverflow.com/questions/3223112/javaee6-dao-should-it-be-stateless-or-applicationscoped (DAO는 EJB가 아니어야 함)를 확인하십시오. –

관련 문제