메시지 구동 Bean - 서비스 통합 버스를 사용한 트랜잭션 처리
메시지 구동 Bean은 트랜잭션 범위 내의 대상(또는 엔드포인트)에서 메시지를 처리할 수 있습니다.
선택한 메시지 구동 Bean 배치 디스크립터 설정에 따라 컨테이너 관리 트랜잭션(필수), 컨테이너 관리 트랜잭션(지원되지 않음) 및 BMT(Bean 관리 트랜잭션)라는 세 가지 경우가 있습니다.
메시지 구동 Bean 배치 디스크립터 설정에서 메시지 구동 Bean이 자신의 트랜잭션(BMT)을 관리하는지 아니면 컨테이너가 메시지 구동 Bean을 대신해서 트랜잭션(컨테이너 관리 트랜잭션)을 관리하는지 여부를 선택할 수 있습니다. 메시지 구동 Bean 배치 디스크립터 설정에 대한 정보는 메시지 구동 Bean 배치 디스크립터 속성을 참조하십시오. 컨테이너 관리 트랜잭션을 선택하는 경우, 배치 디스크립터 노트북에서 각 Bean 메소드의 컨테이너 트랜잭션 유형을 선택하여 컨테이너 트랜잭션이 필수이거나 지원되지 않는지 여부를 판별할 수 있습니다. 기본 컨테이너 트랜잭션 유형은 필수입니다.
- 컨테이너 관리 트랜잭션(필수)
이러한 경우 애플리케이션 서버가 대상으로부터 수신 메시지를 읽기 전에, 그리고 메시지 구동 Bean의 onMessage() 메소드를 호출하기 전에 글로벌 트랜잭션을 시작합니다. 이것은 메시지가 호출한 다른 EJB 및 데이터베이스 같은 자원과의 상호작용이 이 단일 글로벌 트랜잭션 내에서 모두 범위가 지정되고, 이 범위에서 수신 메시지를 확보함을 의미합니다.
이 애플리케이션 플로우가 성공적으로 완료되면 글로벌 트랜잭션이 커미트됩니다. 플로우가 완료되지 않으면(트랜잭션이 롤백으로 표시되거나 런타임 예외가 발생한 경우), 트랜잭션이 롤백되고 수신 메시지가 메시지 구동 Bean 대상으로 롤백됩니다.
- 컨테이너 관리 트랜잭션(지원되지 않음)
이러한 경우 글로벌 트랜잭션이 없습니다. 그러나 JMS 제공자가 여전히 메시지 구동 Bean 대상에서 애플리케이션 서버로 작업 단위로 메시지를 전달할 수 있습니다. 이 작업은 트랜잭션 범위에 있는 다른 자원과 관련이 없으므로 로컬 트랜잭션으로 간주할 수 있습니다.
메시지 구동 Bean의 onMessage() 디스패치가 성공적으로 완료될 때 애플리케이션 서버가 메시지 전달을 수신확인합니다(메시지 구동 Bean의 어셈블러에서 지정한 수신확인 모드 사용).
그러나 onMessage() 메소드에서 확인하지 못한 런타임 예외가 발생하면 애플리케이션 서버가 수신확인을 수행하지 않습니다. 이 경우, 메시지가 메시지 구동 Bean 대상으로 롤백됩니까? 아니면 수신확인되고 삭제됩니까?
답은 JMS 제공자가 동기점을 사용하는지 여부에 따라 다르며, 운영 플랫폼에 따라서도 달라질 수 있습니다(특히, z/OS® 운영 플랫폼은 다른 작동을 일으킬 수 있음).
JMS 제공자가 이 컨테이너 관리 트랜잭션(지원되지 않음) 경우에 메시지 구동 Bean 메시지 사용에 관한 동기점을 설정하면 확인하지 못한 예외 이후 메시지가 대상으로 롤백됩니다.
동기점이 사용되지 않으면 확인하지 못한 예외 이후 대상에서 메시지가 삭제됩니다.
관련 정보는 기술 노트 "MDB behavior is different on z/OS than on distributed when getting nonpersistent messages within syncpoint"(http://www.ibm.com/support/docview.wss?uid=swg21231549)를 참조하십시오.
- BMT
이러한 경우 컨테이너 관리 트랜잭션(지원되지 않음) 경우와 비슷합니다. 이 경우 사용자 트랜잭션이 있을 수 있지만 메시지 구동 Bean의 onMessage() 디스패치에서 시작된 사용자 트랜잭션에는 트랜잭션 범위 내 메시지 구동 Bean 대상의 메시지 이용이 포함되지 않습니다. 이렇게 하려면 컨테이너 관리 트랜잭션(필수) 시나리오를 사용하십시오.