2016-06-22 1 views
0

메시지 처리 시간을 지정할 수 있으며, 초과하면 TIMEOUT 예외가 발생합니까? 트랜잭션 시간 제한을 설정하려고했지만 작동하지 않았습니다. 시간이 지났지 만 예외는 발생하지 않았습니다. DefaultTransactionDefinition.getTimeout() 메소드조차 호출되지 않았습니다 (디버거에 중단 점이 있음). DefaultTransactionDefinition.setTimeout (int)가 올바른 값으로 호출되었습니다. 여기 메시지 구동 채널 어댑터 시간 제한 처리

내 설정이다 :

<int-jms:message-driven-channel-adapter id="x" 
             channel="incoming" 
             container="my" 
             error-channel="errors"/> 

컨테이너 "내"확장 DefaultMessageListenerContainer과 내가 가지고있는 곳이다 :

@Override 
@Autowired 
@Value("5") 
public void setTransactionTimeout(final int transactionTimeoutInSec) 
{ 
    super.setTransactionTimeout(transactionTimeoutInSec); 
} 

다른 방법이 있나요? 고맙습니다!

+0

아마도 외부'transaction-manager'를 설정하지 않은 문제일까요? –

답변

0

스프링 통합이 아닌 적어도 원시 자바에 대해 비슷한 것을 할 수 있는지 궁금합니다. 나는 메소드 호출 기간을 제한 할 수있는 방법을 모른다. 물론 비동기 호출과 스레드 예외를 통해 원하는 예외로 대기하고 인터럽트 할 수 있습니다. 적어도 timeout<gateway>에서 작동하는 방법입니다. 하지만 그 중 하나는 요청 - 응답을위한 것입니다. 귀하의 경우 그것은 단방향 흐름입니다.

내가 제안한 것처럼 비동기식 핸드 오프로 일부 AOP 조언을 고려할 수도 있지만 각 메시지가 대기하고 대기 기간을 원하는 timeout으로 제한하기 위해 CountDownLatch과 같이 제안 할 수 있습니다.

이 다른 측면에서 아웃 - 오브 - 박스 구성 요소 정말 거기에 당신을 도울 수 <barrier>, 같은 :

  1. 당신은 대상 서비스
  2. 에게 메시지를 보낼 수있는 첫 번째 ExecutorChannel 수신자와 <recipient-list-router> 필요
  3. 두 번째받는 사람 timeout 또는 좋은 결과에 대한 주 스레드를 차단하는 <barrier>에 대한 DirectChannel이어야합니다.
  4. 실제 서비스 플로우의 어딘가에서 triggerBarrierHandler으로 주 스레드를 올바르게 풀어 내야합니다.
  5. require-replytrue으로 구성하는 것을 잊지 마십시오. 이 경우 ReplyRequiredException이 발생합니다. 어떻게 든 잡아야합니다 (예 : error-channel의 핸들러를 TimeoutException으로 바꿈)
  6. 적절한 것을 지정하는 것을 잊지 마십시오. correlation-strategy.

하지만 시스템의 오버 헤드가 아닌지 확인하고 처리 시간 제한에 대해 정말로 염려 할 필요가 있는지 이해하려고합시다.