У меня есть очень распространенный сценарий. У меня есть система счетов, которая управляется через Apache Camel. Когда что-то идет не так, я хотел бы, чтобы администратору было отправлено уведомление по электронной почте.
Прочитав об обработке исключений Camel, я пришел к следующему: (внутри моего Spring 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}}&subject={{errormail.subject}}&from={{errormail.from}};debugMode=true;connectionTimeout=5000" />
</route>
Это работает ОК для моего варианта использования. При возникновении любого исключения отправляется электронное письмо
действительно по указанному адресу.
Однако, чтобы проверить угловые случаи, я остановил внутренний почтовый сервер, чтобы посмотреть, что
случается. Я ожидал, что Camel попытается отправить электронное письмо и прекратит попытки через 5 секунд (как установлено в параметре connectionTimout в приведенном выше URL-адресе smpt)
В действительности, однако, ВСЕ приложение верблюда висит! Это просто недопустимо!
Я не могу гарантировать, что почтовый сервер будет работать на 100%.
Я что-то здесь упускаю? Должен ли я вообще отказаться от представления уведомлений по электронной почте или же Camel нужна другая специальная опция для НЕ зависания, когда почтовый сервер не работает?
Ответ
Линия
debugMode=true;connectionTimeout=5000
должно быть
debugMode=true&connectionTimeout=5000