Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java邮件排队或不排队_Java_Queue_Jakarta Mail - Fatal编程技术网

使用Java邮件排队或不排队

使用Java邮件排队或不排队,java,queue,jakarta-mail,Java,Queue,Jakarta Mail,该场景是从web请求向用户发送密码重置邮件(将来可能还有其他与邮件相关的任务) 我带到表中用于排队的参数: 我认为应该尽快处理web请求 将发送操作与请求分离,更容易实现邮件系统的外部化(如果将来需要) 我认识到反对排队的论点: 如果在发送消息的过程中出现问题,用户不会得到反馈 在这次讨论中还有什么论据?对于那些赞成排队的人,你将如何实现排队?预定的行动?无限排队任务(当然有间隔) 谢谢 您肯定不希望同步发送,因为邮件服务器可能速度较慢 发送JMS消息并使用MDB发送电子邮件。在Java

该场景是从web请求向用户发送密码重置邮件(将来可能还有其他与邮件相关的任务)

我带到表中用于排队的参数:

  • 我认为应该尽快处理web请求

  • 将发送操作与请求分离,更容易实现邮件系统的外部化(如果将来需要)

我认识到反对排队的论点:

  • 如果在发送消息的过程中出现问题,用户不会得到反馈
在这次讨论中还有什么论据?对于那些赞成排队的人,你将如何实现排队?预定的行动?无限排队任务(当然有间隔)


谢谢

您肯定不希望同步发送,因为邮件服务器可能速度较慢


发送JMS消息并使用MDB发送电子邮件。

在JavaEE6+场景中,您可以在EJB方法中使用
@Asynchronous
注释。它返回一个
未来
。因此,当任务在另一个线程中执行时,您可以继续处理并稍后请求任务结束。 因此,您可以快速接受大量请求,将发送操作与请求分离,并可以获得反馈。
我想你应该去排队。因为它有助于快速性能和检查密码重置请求是否来自正确的来源

因此,您可以使用Map来实现队列。因为在map中,u可以使用电子邮件id作为键,使用唯一的请求引用作为值。并且应该在一段时间内删除此映射元素


同样对于快速电子邮件服务,你可以创建一个简单的线程类来发送电子邮件,并通过在其中传递一些数据参数来启动一个新线程。这些线程的调度将由web容器自动管理。

我建议您将邮件的实际发送与应用程序业务逻辑分离。异步执行此操作:使用队列或至少不同的线程发送此类通知:

  • 发送邮件可能是一项耗时的操作, 即使你使用你自己的内部邮件服务器,这是接近你的应用程序。 SMTP会话由多个请求/响应组成
  • 不要将发送邮件视为事务性操作。 当目标SMTP服务器以250 OK作为数据命令的响应进行回复时,它只负责此邮件,而不负责其他内容。 如果链中的下一个服务器无法传递邮件,则将来的传递可能会失败(请阅读有关DSN的内容)

  • 您可能认为应该尽快为请求提供服务,但是用户呢?他怎么想

    用户需要重置其密码。他不在乎需要多长时间。如果他不能完成那个请求,他什么也做不了


    不要排队。

    在这种情况下,这绝对不是一项“可选任务”。你为什么这么认为?如果您希望或多或少地保证邮件的送达,那么您需要通过自己的SMTP基础设施发送所有此类邮件,在这种情况下,它将类似于队列,并在出现tmp错误等情况下负责重新送达。但如果您没有,那么从性能角度来看,异步发送邮件要好得多。我还记得,即使您使用Java mail或其他方式从应用程序同步发送邮件,并且目标服务器响应为250 OK,也并不意味着邮件已发送给最终用户。可能涉及多个服务器,这些服务器可能会在交付时失败。所以,如果您想要实现真正的用户友好型解决方案,您还应该实现DSN消息的处理等等。