我的服务器需要经常发送电子邮件。电子邮件很重;他们有附件和内嵌图像。
我的现有代码会阻止代码,直到发送电子邮件为止。 (每封电子邮件丢失5到6秒)
在没有阻止主代码流的情况下处理电子邮件的最佳方法是什么?
如果您建议使用线程,请详细说明如何有效地处理线程?
答案 0 :(得分:1)
有多种方法可以实现此功能。
同步通话
这是您已经使用的那个。代码(同步)调用Java Mail API并等待API完成执行。该过程可能需要一些时间,具体取决于构建电子邮件消息的复杂性(从数据库中获取记录,读取图像/文档(附件),与邮件服务器通信等。
权衡
多线程方法
创建一个单独的线程以异步发送电子邮件。调用代码不需要等待电子邮件发送功能完成并执行其余代码。理想情况下,应该使用ThreadPool,而不是简单地创建新线程。
权衡
虽然请求延迟会下降,但仍然不可靠。构建/发送电子邮件时发生的任何异常都可能导致,而不会向用户发送电子邮件。
电子邮件发送功能无法分布在多台计算机上。
可以重试功能,因为电子邮件代码被分成单独的类。这个类可以独立调用,而不需要重做其他东西。
异步处理
创建一个类,该类接受电子邮件请求并将其存储在数据库或消息传递基础结构(例如JMS)中。消息侦听器将在到达时处理任务,并针对每个任务更新状态。
权衡
答案 1 :(得分:0)
如果为每个必须发送的电子邮件生成一个帖子,就可以有效地执行此操作。
一种方法如下:
您需要的课程只是Thread
的纯粹扩展名:
public class MailSenderThread extends Thread {
@Override
public void run() {
try {
// Code to send email
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
当您想发送电子邮件时,您可以:
new MailSenderThread().start();
这是我能想到的最短/最简单的方式。
您也可以参考an example in my public repository。这是偏离主题的,但它得到了概念。