4

我有一个我认为很常见的情况。我有一个通过 Apache 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 秒后停止尝试(如上面 smpt URL 中的 connectionTimout 选项中设置的那样)

然而实际上整个骆驼应用程序挂起!这简直不能接受!我不能保证邮件服务器会 100% 运行。

我在这里错过了什么吗?我应该完全放弃电子邮件警报的想法,还是 Camel 需要另一个特殊选项来在邮件服务器关闭时不挂起?

回答

线

debugMode=true;connectionTimeout=5000 

应该

debugMode=true&amp;connectionTimeout=5000
4

1 回答 1

1

Camel 使用 Java Mail API,因此发送电子邮件或找出问题所在需要多长时间。

您可以使用wireTap 异步发送电子邮件。然后错误处理程序线程将不会出现更长的阻塞时间 http://camel.apache.org/wire-tap

于 2011-08-18T12:55:05.900 回答