Компонент Apache Camel smtp зависает вся шина, если почтовый сервер не работает - PullRequest
4 голосов
/ 18 августа 2011

У меня есть очень распространенный сценарий. У меня есть система счетов, которая управляется через 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}}&amp;subject={{errormail.subject}}&amp;from={{errormail.from}};debugMode=true;connectionTimeout=5000" />
        </route>

Это работает ОК для моего варианта использования. При возникновении любого исключения отправляется электронное письмо действительно по указанному адресу.

Однако, чтобы проверить угловые случаи, я остановил внутренний почтовый сервер, чтобы посмотреть, что случается. Я ожидал, что Camel попытается отправить электронное письмо и прекратит попытки через 5 секунд (как установлено в параметре connectionTimout в приведенном выше URL-адресе smpt)

В действительности, однако, ВСЕ приложение верблюда висит! Это просто недопустимо! Я не могу гарантировать, что почтовый сервер будет работать на 100%.

Я что-то здесь упускаю? Должен ли я вообще отказаться от представления уведомлений по электронной почте или же Camel нужна другая специальная опция для НЕ зависания, когда почтовый сервер не работает?

Ответ

Линия

debugMode=true;connectionTimeout=5000 

должно быть

debugMode=true&amp;connectionTimeout=5000

1 Ответ

1 голос
/ 18 августа 2011

Верблюд использует Java Mail API и, следовательно, зависит от того, сколько времени потребуется, чтобы отправить электронное письмо или выяснить, что-то не так.

Вы можете использовать wireTap для асинхронной отправки электронной почты. Тогда поток обработчика ошибок не будет блокироваться в течение более длительного времени. http://camel.apache.org/wire-tap

...