【问题标题】:Asynchronous email processing in Java web applicationJava Web 应用程序中的异步电子邮件处理
【发布时间】:2011-02-07 00:58:05
【问题描述】:

当用户注册新帐户时,我想在我的 Web 应用程序中实现异步电子邮件发送。这样一来,如果在发送电子邮件消息时出现问题或延迟(例如,邮件服务器已关闭或与邮件服务器的网络连接速度很慢),用户将不会一直等待发送完成。

我的网络应用是使用 Spring 和 Hibernate 的 JPA 实现构建的。

对我来说,在这个 Web 应用程序中实现异步电子邮件处理的最佳和最可靠的方法是什么?

我正在考虑将电子邮件信息保存在数据库表中,然后由 Quartz (http://www.opensymphony.com/quartz/) 计划作业定期轮询更新,当它发现新的未发送电子邮件时,它会尝试发送它们。

这是实现我想要的合理方式吗?

谢谢。

编辑:

投票最多的响应是将邮件发送保留为同步调用,但触发我认为异步方法可能是最好的想法是我目前正在使用 GMail 作为我的出站邮件服务器(这是为了测试而从我的应用程序尝试发送电子邮件到对邮件发送函数的调用返回时,我遇到了 25 秒的响应延迟。你怎么看?

【问题讨论】:

    标签: java email quartz-scheduler asynchronous


    【解决方案1】:

    我建议你不要打扰。大多数 Unix 风格的 MTA 在几十年前就发明并完善了延迟发送,你不应该重新发明轮子。你会做得很差(与 sendmail 或 postfix 相比),你会错过一些东西。我最好的建议是使用 Java Mail APIS javax.mail 并让 MTA 处理异步部分。

    【讨论】:

    • 这种方法的问题是我目前使用 gmail 作为我的出站邮件服务器(这是为了测试),我的应用程序尝试发送时响应延迟 25 秒对邮件发送函数的调用返回时发送的电子邮件。这就是触发我认为异步方法可能是最好的想法的原因。你怎么看?
    • @Denise 我同意异步位。您可以在 Servlet 引擎中运行一个后台线程,它将 JavaMail“消息”从列表或向量中取出并进行处理。
    【解决方案2】:

    您可以使用 MySQL 或其他一些持久性机制手动实现排队,但您也可以使用 JMS 进行排队。对于这种情况,它几乎是完美的匹配。

    在这种情况下,我会尝试将邮件组件从主应用程序中分离出来,并让两者使用 JMS 进行通信。主应用程序将消息放入 JMS,邮件程序应用程序将订阅队列并尝试处理消息。

    JMS 可以通过配置很容易地持久化(例如 MySQL)。

    拆分 webapp 的好处是您可以抽象出通知机制,并且可以在将来实现例如Google Wave 或 IRC 或其他任何东西,而无需触摸您的主应用程序。

    其他人建议使用 postfix 或 sendmail 并让他们处理排队。这也是一个很好的解决方案,特别是如果您将 postfix 或 sendmail 放在 localhost 上并让它进一步路由消息。请尝试配置该邮件程序,以便仅允许路由来自本地主机的邮件,以防止创建打开的邮件程序:)

    EDIT澄清了JMS的使用+对本地邮件守护进程的评论

    【讨论】:

    • JMS 不等于 Java 邮件。 JMS 与电子邮件无关。
    • @Chris 不,排队可以通过JMS来实现。
    • 它可以,但我认为它对于用户想要做的事情过于复杂。当然可行,并且在某些架构中,可能更可取(例如,ESB,HIPAA 合规性)。
    【解决方案3】:

    这是相当合理的,这就是 Quartz 的构建目标。

    但是,请注意,您根本不需要通过数据库进行调度(除非服务器停机是一个真正的问题)。您可以简单地安排 Quartz 作业而无需访问数据库(最简单的 Quartz 示例向您展示如何)。

    否则,如果您确实选择了数据库访问权限,您就有可能完全从另一个应用程序发送电子邮件(如果您需要,这是一件好事)。

    【讨论】:

      【解决方案4】:

      Java EE 6 使用 @Asynchronous 注释让这一切变得如此简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-13
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多