【问题标题】:How should a Java program handle an external mail server being down?Java 程序应该如何处理外部邮件服务器的故障?
【发布时间】:2010-12-14 19:52:48
【问题描述】:

我有一个持续运行的 Java 程序,它需要在遇到问题时发送电子邮件。但是,它使用的邮件服务器在尝试发送电子邮件时可能已关闭。

在邮件服务器恢复正常时确保邮件送达的最佳方法是什么?

【问题讨论】:

    标签: java email smtp jakarta-mail


    【解决方案1】:

    将请求排队。有一个单独的线程,它只是等待某些东西进入队列,然后尝试通过电子邮件发送它。如果失败,它会等待几个小时,然后重试。一旦它发送了一条消息,它就会返回队列以获取下一条消息。

    【讨论】:

    • 我同意这一点。如果您有机会变得更复杂一点,您可以使您的队列类足够聪明,以知道何时重复消息。然后,当您的邮件服务器恢复运行时,您将不会收到 5,000 封电子邮件告诉您网络已关闭。 :)
    • 如果您想要保证交付,您需要使用某种数据存储(数据库、文件等)来支持它,以防应用程序出现故障并且队列不明确。
    • 或者使用保证交付的JMS队列管理器。市面上有很多这样的产品。
    【解决方案2】:

    发送失败时将邮件对象放入堆栈或列表中,当邮件服务器恢复时,将每封邮件弹出直到它为空。

    【讨论】:

      【解决方案3】:

      您可能希望将电子邮件保存在一个文件中,也许是一个 xml 文件,以便在应用程序崩溃时您不会丢失此信息。

      此文件在应用程序启动时加载,并将所有内容保存在内存中,因此当有待处理的电子邮件时,它会每隔 5 分钟左右检查一次,然后,当它发送每封电子邮件时,它会重新保存 xml 文件,因此,如果它在发送 10 封电子邮件中的 3 封后崩溃,它不会在启动时重新发送这三封。

      但是,您如何处理这实际上将取决于如何处理错误情况的规范。

      【讨论】:

      • 如果你想处理崩溃,那么你不应该写入同一个文件,因为写入时崩溃可能会导致大部分数据丢失。使用多个文件可能更安全。
      • 是的,根据偏执程度,您可以使用两个文件,只写入一个文件,然后替换原始文件,以限制出现问题的机会。这完全取决于您对可靠性的依赖程度。
      • 为什么不维护一个待处理消息的目录。这样您就可以限制损坏的可能性,并且您不会读取/写入一个(可能很大)文件
      • @Brian Agnew - 你可以这样做,但这取决于系统出现故障的频率。拥有一个单独的目录意味着您预计系统会经常停机,并且邮件服务器不可用。有人需要进行分析,以确定他们应该为他们遇到问题的可能性做些什么。
      【解决方案4】:

      如果您从“将所有内容转发到始终存在的 SMTP 服务器”到需要处理通常由完整 SMTP 服务器处理的各种情况(例如稍后重试、如果连接关闭则重新传输)的情况,请使用 MX - 主机按其规定的顺序和类似的顺序,您可能只想考虑在您的客户端内拥有一个 SMTP 服务器(但一个不接受传入连接的服务器),因为这会将所有脏逻辑从您的应用程序。

      我相信 James 电子邮件服务器 - http://james.apache.org/ - 很容易嵌入,但我还没有真正尝试过。

      【讨论】:

      • 为什么要把邮件服务器放在app里?只需在本地主机上安装一个即可。
      • @JimV 您可能没有这样做的权限。
      【解决方案5】:

      使用 James 的建议很好,但我过去遇到过一些问题,即 James 有点不稳定,需要重新启动。

      您可以使用 Quartz 之类的工具让调度程序检查需要发送的消息。如果无法发送消息(例如 smtp 服务器不可用),则重新安排该消息以稍后发送。您可以对每条消息有一个任务,也可以有一个持久任务来检查消息和可用的邮件服务器,然后发送消息。持久任务将为您提供电子邮件批处理。

      【讨论】:

        【解决方案6】:

        如果您在 Unix/Linux 世界中,请考虑使用 syslog 发送警报的替代方法,并在该端处理电子邮件的生成。例如,nsyslogd 有一个名为 ommail 的模块,用于在本地生成电子邮件。

        IIRC,有一些适用于 log4j 之类的适配器,可以在 Java 和 syslog 世界之间架起一座桥梁,只需最少(零?)编码。

        【讨论】:

          【解决方案7】:

          Apache James - http://james.apache.org/ 将让您将自己的邮件服务器作为代理运行,不仅如此,而且是用 100% java 编写的,所以您可以弄清楚它在做什么, 作为额外的奖励,James 使用数据库对邮件进行排队,因此您甚至可以通过插入数据库将邮件直接注入队列中,然后将发送邮件的整个业务留给 James。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-08
            • 2019-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-26
            相关资源
            最近更新 更多