2011-08-18 1 views
4

나는 매우 일반적인 시나리오라고 생각합니다. 아파치 카멜을 통해 관리되는 인보이스 시스템이 있습니다. 문제가 발생하면 관리자에게 이메일 알림을 보내고 싶습니다.메일 서버가 다운 된 경우 Apache Camel SMTP 구성 요소가 전체 버스를 중지합니다.

낙타 예외 처리에 대한 책을 읽은 후, 나는이 함께했다 : (내 봄 XML 내부)

<!-- General retrasmission policy set to 3 times --> 
     <errorHandler id="deadChannel" type="DeadLetterChannel" 
      deadLetterUri="direct:invoice-error"> 
      <redeliveryPolicy maximumRedeliveries="2" 
       redeliveryDelay="1000" backOffMultiplier="2" useExponentialBackOff="true" /> 
     </errorHandler> 

     <!-- Problematic invoices create email alerts to the administrator --> 
     <route id="invoices-with-errors"> 
      <from uri="direct:invoice-error" /> 
      <bean ref="emailAlert" method="handleProblematicInvoice" /> 
      <to 
       uri="smtp://{{errormail.host}}?to={{errormail.to}}&amp;subject={{errormail.subject}}&amp;from={{errormail.from}};debugMode=true;connectionTimeout=5000" /> 
     </route> 

이 내 사용 사례에 대한 OK 작동합니다. 예외가 발생하면 이 실제로 정의 된 주소로 전송됩니다.

그러나 코너 사례를 테스트하기 위해 내부 이메일 서버를 중단하여 이 발생하는지 확인했습니다. Camel이 이메일 보내기를 시도하고 5 초 후에 시도를 중단 할 것을 기대했습니다. (위의 smpt URL에있는 connectionTimout 옵션에서 설정 한대로)

그러나 전체 이용 일정은 중단됩니다! 이것은 단순히 받아 들일 수 없다! 메일 서버가 100 % 향상 될 것이라고 보장 할 수 없습니다.

여기에 뭔가가 있습니까? 전자 메일 알림을 모두 삭제해야합니까, 아니면 낙타가 메일 서버가 다운되었을 때 가 아닌에 매달려 있어야합니까?

대답

라인

debugMode=true;connectionTimeout=5000 

debugMode=true&amp;connectionTimeout=5000 
+0

기본 내부 서버로 릴레이 할 로컬 호스트 SMTP 스풀을 설정 하시겠습니까? –

+0

@ Steve-o Ι는 프로덕션에 액세스 할 수 없습니다. IT 서비스 .war 파일 만 보내고 배포 할 수 있습니다. 나는 그들에게 아무것도 보낼 수 없다. – kazanaki

답변

1

낙타는 자바 메일 API를 사용하고, 따라서이를 보내는 데 걸리는 시간의 자비 아래에 있어야한다 이메일을 보내거나 뭔가 잘못되었다고 생각하십시오.

wireTap을 사용하여 전자 메일을 비동기로 보낼 수 있습니다. 그런 다음 오류 처리기 스레드가 더 오랫동안 차단되지 않는 것처럼 보입니다. http://camel.apache.org/wire-tap

+0

Ok.하지만 connectionTimout이 작동하지 않아야합니까? 이제 영원히 차단됩니다. 또한 도청 장치를 사용하고 메일 서버가 다운 된 경우 예외가 발생하고 오류 처리기 라우팅이 다시 무한 루프로 이어집니다. 옳은? – kazanaki

+0

오류 처리 중에 오류 처리기가 다시 시작되지 않습니다. 이것은 Camel 2.8에서 더욱 향상되었습니다. 2 차 예외가 발생하면 랩핑 된 예외가 설명 오류 메시지와 함께 설정됩니다. –

+0

또한 연결 시간 초과 옵션이 잘못되었으므로 & 문자를 사용해야합니다. debugMode = true; connectionTimeout = 5000은 debugMode = true 여야합니다. & connectionTimeout = 5000 –