2012-01-18 2 views
5

EJB B을 호출하는 EJB A이 있습니다. UI는 응답을 위해 30 초 이상 기다리지 않아야합니다. 일부 데이터가 누락 된 경우 부분 응답을 반환해야합니다.시간 초과로 EJB 호출하기

EJB B에서 시간 초과 (시간 제한 30 초)를 어떻게 정의 할 수 있습니까?

Future을 반환하고 Future.get(30, TimeUnit.SECONDS)을 반환하는 을 Asynchronous으로 정의 할 수 있습니다. 하지만 최상의 솔루션입니까?

감사합니다.

P. 글래스 피쉬를 사용합니다. 3.1

답변

0

모든 메소드에 적용되는 빈에 대한 시간 초과를 구성하려면 glassfish-ejb-jar.xml에 cmt-timeout-in-seconds 속성을 구성해야합니다.

이 시간 초과 값은 새 트랜잭션을 시작하는 bean의 모든 메소드에서 사용되며, 다른 진행중인 트랜잭션에 참여할 때 적용되지 않습니다.

시간 제한에 대한 자세한 내용은 link을 참조 할 수도 있습니다.

2

대상 EJB를 인터럽트 할 방법이 없습니다. 유일한 실제 옵션은 목표 EJB가 의도 된 목표 응답 시간을 초과했는지 여부를 공동으로 및 주기적으로 확인하는 것입니다.

@AsynchronousFuture.get 시간이 초과 된 경우에도 클라이언트가 결과를 기다리지 않도록 간단하게 차단했습니다. 대상 EJB는 계속 실행하고 자원을 소비합니다. 그러나 비동기 메서드를 사용하면 Future.cancelSessionContext.wasCancelCalled을 사용하여 일부 조합 된 해지 취소의 이점을 얻을 수 있습니다.

+0

EJB를 인터럽트하려는 것이 아닙니다. 아이디어는 30 초 후에 UI에 응답 (또는 "시간 초과 오류")을 반환하는 것이 었습니다. – lili

+2

물론 프런트 엔드를 타임 아웃하지 않고 타이밍 아웃하는 것은 현명하지 못한 것처럼 보입니다. 결국 백 엔드 스레드가 소비되고 프런트 엔드 스레드가 기다려야합니다. 당신이 말한 것을 감안할 때'@ Asynchronous'를 사용하는 것이 가장 좋습니다. –

5

이 작업에 트랜잭션 시간 초과를 사용하는 것이 좋습니다.

응용 프로그램 서버에 따라 다르므로 표준 구성 방법이 없다고 생각합니다. 클래스 또는 메소드별로 구체적으로 설정하려고한다고 가정합니다.

WebLogic의 경우 "transaction-descriptor"의 "weblogic-ejb-jar.xml"에 지정할 수도 있고 "@TransactionTimeoutSeconds"라는 주석을 사용할 수도 있습니다.

http://docs.oracle.com/cd/E12839_01/web.1111/e13719/ejb_jar_ref.htm#i1506703 당신은 주석 또는 "의 jboss.xml"에서 "@TransactionTimeout"를 사용하여 트랜잭션 타임 아웃을 설정할 수 있습니다 AS 보스를 들어

http://docs.oracle.com/cd/E21764_01/web.1111/e13720/annotations.htm#i1438354

.

https://community.jboss.org/wiki/TransactionTimeout

나는 모든 응용 프로그램 서버에서 유사한 구성 옵션이 있습니다 확신합니다.

관련 문제