단일 진입 점 (메소드)이있는 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는 어떨까요? 주석을 달 필요가 있습니까? 그리고 어떤 것들을 사용해야합니까?
이 도움말에서 나에게 도움을 주시기 바랍니다. 내 구현에 대한 자세한 내용을 알고 싶다면 알려주십시오.
그게 문제를 해결했습니다. 내 웹 서비스 빈의 암시 적'REQUIRED' 속성을 잊어 버렸습니다. 트랜잭션을 롤백하기 위해'ApplicationException'을 던지면서 추가 작업을해야했습니다. 감사! – Baderous
DAO의 경우 http://stackoverflow.com/questions/3223112/javaee6-dao-should-it-be-stateless-or-applicationscoped (DAO는 EJB가 아니어야 함)를 확인하십시오. –