电子邮件队列的Java实现

电子邮件队列的Java实现,java,mysql,email,smtp,jakarta-mail,Java,Mysql,Email,Smtp,Jakarta Mail,我有一个DB,其列为: | from_email | to_email | subject | body | processed(Y/N) | 现在,我想用Java实现一个系统,该系统将访问此数据库以获取未处理的数据,发送邮件(我正在使用fakeSMTP进行测试),并将其设置为已处理 虽然我还没有添加任何线程,但它已经足够好了 但问题是要加快可能部署在多个服务器上的过程,在这种情况下,如何确保邮件不会被发送两次 如何加快速度?以下是解决问题的方法: 每个服务器都应该有一个唯一的id 将默认值为

我有一个DB,其列为:

| from_email | to_email | subject | body | processed(Y/N) |
现在,我想用Java实现一个系统,该系统将访问此数据库以获取未处理的数据,发送邮件(我正在使用fakeSMTP进行测试),并将其设置为已处理

虽然我还没有添加任何线程,但它已经足够好了

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


如何加快速度?

以下是解决问题的方法:

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

  • 将默认值为
    null
    的服务器id添加到
    mails
    表中

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

    更新邮件
    设置服务器\u id=
    其中(服务器id为null)和()

  • 处理完
    更新后
    ,选择该行,如果
    服务器id
    具有预期值(未发生并发问题),则处理该行

  • 如果记录的
    server\u id
    不是
    null
    ,则其处理已开始。如果它的
    server\u id
    不为空,并且它的
    processed
    Y
    ,则它已被处理


  • 如果我没有服务器id怎么办?现在我正在我的系统上测试,所以没有办法获得服务器id。现在,我可以将随机值作为id传递;但不确定在真实场景中会发生什么。如果您没有服务器id,请创建一个。服务器应该有这样的设置,如果没有值,则生成一个并存储到数据库中,这样就不会有重复的服务器ID。因此,没有服务器id的问题的解决方案是:创建服务器id。但是如果我使用线程,那么使用服务器id无法解决问题。我仍然需要区分它们。你也可以添加一个线程id。如果您在不同的服务器上使用不同的线程,那么您可以同时拥有服务器id和线程id并同时使用它们。谢谢@Lajos。这当然是更好的办法。