【问题标题】:Email queue implementation with Java使用 Java 实现电子邮件队列
【发布时间】:2015-06-17 09:12:53
【问题描述】:

我有一个数据库,其列是:

| from_email | to_email | subject | body | processed(Y/N) |

现在我想用 Java 实现一个系统,该系统将访问此数据库以进行未处理,发送邮件(我正在使用 fakeSMTP 进行测试)并将其设置为已处理。

它工作得很好,虽然我还没有添加任何线程。

但问题是要加快可能部署在多个服务器上的过程,在这种情况下,我如何确保没有邮件被发送两次?

如何让它更快?

【问题讨论】:

    标签: java mysql email smtp jakarta-mail


    【解决方案1】:

    以下应该是您的问题的解决方案:

    1. 每个服务器都应该有一个唯一的 id

    2. 将默认值为null 的server_id 添加到您的mails 表中

    3. 当服务器打算发送邮件时,运行查询,例如:

      update mails set server_id = <your server_id> where (server_id is null) and (<your other criteria>)

    4. 处理完update后,选择行,如果server_id有预期值(没有出现并发问题),则处理它

    5. 如果记录的server_id 不是null,那么它的处理已经开始。如果它的server_id不为null,并且它的processedY,那么它已经被处理了。

    【讨论】:

    • 如果我没有服务器 ID 怎么办?现在我正在我的系统上进行测试,所以没有办法获得服务器 ID。现在,我可以将随机值作为 id 传递;但不确定在实际场景中会如何。
    • 如果您没有 server_id,则创建一个。服务器应该有这样的设置,如果没有值,则生成一个并存储到数据库中,这样您就不会有重复的服务器 ID。所以,没有server id问题的解决办法是:create server ids。
    • 但如果我使用线程,在这种情况下使用服务器 ID 将无法解决问题。我仍然需要区分它们。
    • 您也可以添加线程ID。如果你在不同的服务器上使用不同的线程,你可以同时拥有服务器 id 和线程 id 并同时使用它们。
    • 谢谢@Lajos。这当然是更好的方法。
    猜你喜欢
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2010-09-06
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多