在没有阻止主代码流的情况下,用java发送电子邮件的最佳方法是什么?

时间:2017-04-21 08:36:08

标签: java multithreading email

我的服务器需要经常发送电子邮件。电子邮件很重;他们有附件和内嵌图像。

我的现有代码会阻止代码,直到发送电子邮件为止。 (每封电子邮件丢失5到6秒)

在没有阻止主代码流的情况下处理电子邮件的最佳方法是什么?

如果您建议使用线程,请详细说明如何有效地处理线程?

2 个答案:

答案 0 :(得分:1)

有多种方法可以实现此功能。

同步通话

这是您已经使用的那个。代码(同步)调用Java Mail API并等待API完成执行。该过程可能需要一些时间,具体取决于构建电子邮件消息的复杂性(从数据库中获取记录,读取图像/文档(附件),与邮件服务器通信等。

权衡

  1. 对于个别请求(网络/桌面),响应延迟将根据构建和发送电子邮件所需的时间而增加。
  2. 发送电子邮件时的例外情况可能需要重做整个过程(如果重试)。
  3. 由于发送电子邮件时的异常,可能会回滚交易数据(例如数据库)。这可能不是理想的行为。
  4. 如果多个用户同时调用类似功能,则整体应用程序延迟会增加。
  5. 如果电子邮件发送代码与其他功能代码紧密结合,则可能无法进行电子邮件重试功能。
  6. 多线程方法

    创建一个单独的线程以异步发送电子邮件。调用代码不需要等待电子邮件发送功能完成并执行其余代码。理想情况下,应该使用ThreadPool,而不是简单地创建新线程。

    权衡

    1. 虽然请求延迟会下降,但仍然不可靠。构建/发送电子邮件时发生的任何异常都可能导致,而不会向用户发送电子邮件。

    2. 电子邮件发送功能无法分布在多台计算机上。

    3. 可以重试功能,因为电子邮件代码被分成单独的类。这个类可以独立调用,而不需要重做其他东西。

    4. 异步处理

      创建一个类,该类接受电子邮件请求并将其存储在数据库或消息传递基础结构(例如JMS)中。消息侦听器将在到达时处理任务,并针对每个任务更新状态。

      权衡

      1. 可以在分布式模式下处理电子邮件请求。
      2. 可以重试电子邮件,不会产生任何副作用。
      3. 复杂的实现,因为多个组件都涉及处理,保留电子邮件请求。

答案 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。这是偏离主题的,但它得到了概念。