2013-03-12 3 views
0

CMT 기반 EJB를 만들었습니다. EJB는 레코드를 데이터베이스에 삽입 한 다음 다른 코드 (A)를 비동기 적으로 실행합니다. ejb은 처리를 계속하므로 비동기 호출 후에 트랜잭션을 커밋하거나 롤백 할 수 있습니다. 코드 (A)에서 EJB 트랜잭션이 커밋되거나 롤백 될 때까지 기다려야합니다. 그런 다음 EJB가 삽입 한 레코드를 읽거나 다음 실행을 건너 뜁니다. 제 질문은 EJB의 트랜잭션 이벤트를 알리거나 기록을 읽을 수있을 때까지 폴링해야한다는 것입니다. 내가는 IBM WebSphere 7.0 (자바 EE 5)트랜잭션 이벤트 (커밋, 롤백)를 얻는 방법

+1

레코드가 삽입 될 때까지 기다려야하는 종속성이있는 경우 다음 메서드가 순차적으로 아닌 비동기로 호출되는 이유는 무엇입니까? –

+0

@NayanWadekar 비동기 적으로 실행되는 코드는 매우 비싸고 호출하는 비즈니스 논리는 발생하는 다른 문제 (예 : 통계 작성,보고보고, 전자 메일 보내기 등)를 신경 쓰지 않고 진행해야하기 때문에. EJB 코드가 전자 메일 서버가 등록 확인을 보내기를 기다리기 때문에 웹 페이지가로드되지 않으면 어리석은 짓입니까? – bennidi

+0

@bennidi'EJB 트랜잭션이 커밋되거나 롤백 될 때까지 기다려야합니다 .' 따라서 ** 웹 페이지가로드되고 확인을 보내지 않으면 바보가되지 않을 것입니다. 최종 사용자에게 알림을받는 방법, 언젠가는 다시 방문 할 때까지 기다릴 필요가없는 경우. 여기 사람들은 돈을 지불하지 않고 고용되었지만 이해 관계 때문에 & 명확한 설명을 할 의무가 없습니다. 전혀 관련성이없는 의견을 게시하지 마십시오. –

답변

0

에 동기화 할 수있는 유일한 방법을 일하고 있어요

비동기 내가 아는 한, CDI 이벤트를 사용하는 것입니다, 트랜잭션 이벤트에 코드를 호출. 트랜잭션 내부에서 실행되는 코드에서 CDI 이벤트를 보내야합니다. 특정 트랜잭션 결과에서만 실행되도록 CDI 이벤트의 핸들러를 구성 할 수 있습니다. 이러한 핸들러를 트랜잭션 옵저버라고합니다. 11.7

http://docs.jboss.org/weld/reference/latest/en-US/html/events.html

은 기본적으로 그것이 내가 모르는이

public void refreshCategoryTree(@Observes(during = AFTER_SUCCESS) CategoryUpdateEvent event) 
{// only called after the transaction committed successfully } 

과 같은 섹션 참조 -

나는 문법과 일반적인 개념 개요는 JBoss 문서에서이 페이지를 발견 WebSphere 그러나 이것이 CDI Spec의 일부이기 때문에 나는 거기에서도 잘 작동한다고 가정 할 것이다. JBoss와 함께 이것을 한 번 사용했고 그것은 나를 위해 일했습니다. 원할 경우 자체 트랜잭션 내에서 핸들러를 실행할 수도 있습니다.

+0

그는 유감스럽게도 JavaEE 버전 5를 사용하므로 CDEE 버전은 JavaEE 버전 6 (및 버전 1.0 이상)에서만 제공되므로 포함되지 않습니다. – kij

+0

그리고 CDI 이벤트는 Websphere 8.5+와 마찬가지로 작동하지 않습니다 (CDI 1.0). 트랜잭션 관찰자는 CDI 빈이 아니라 @Singleton이어야하며 관찰 방법은 비즈니스 인터페이스에 정의되어야하며 트랜잭션 관찰은 여러 관찰자가있는 경우 실패합니다 이벤트 종류 등. PMR을 열거 나 수정을 기다리지 않는 한 Websphere로이 옵션을 잊어 버리십시오. – kij

관련 문제