Spring mvc发送邮件为非阻塞

时间:2013-08-06 18:17:33

标签: java email spring-mvc

我正在开发一个应用程序,该应用程序在某些情况下会发送邮件。例如;

当用户更新其电子邮件时,会向用户发送激活邮件以验证新的电子邮件地址。这是一段代码;

............
if (!user.getEmail().equals(email)) {
            user.setEmailTemp(email);
            Map map = new HashMap();
            map.put("name", user.getName() + " " + user.getSurname());
            map.put("url", "http://activationLink");
            mailService.sendMail(map, "email-activation");
        }
return view;

我的问题是由于电子邮件发送,响应时间变长了。有没有办法像非阻塞方式发送电子邮件?例如,邮件发送在后台执行,代码继续运行

提前致谢

2 个答案:

答案 0 :(得分:4)

您可以使用Spring设置异步方法以在单独的线程中运行。

@Service
public class EmailAsyncService {
    ...
    @Autowired
    private MailService mailService;

    @Async
    public void sendEmail(User user, String email) {
        if (!user.getEmail().equals(email)) {
            user.setEmailTemp(email);
            Map map = new HashMap();
            map.put("name", user.getName() + " " + user.getSurname());
            map.put("url", "http://activationLink");
            mailService.sendMail(map, "email-activation");
        }
    }
}

我已经在你的模型上做了假设,但是假设你可以传递该方法发送邮件所需的所有参数。如果你正确设置它,这个bean将被创建为一个代理,并且调用@Async带注释的方法将在另一个线程中执行它。

 @Autowired
 private EmailAsyncService asyncService;

 ... // ex: in controller
 asyncService.sendEmail(user, email); // the code in this method will be executed in a separate thread (you're calling it on a proxy)
 return view; // returns right away

The Spring doc should be enough to help you set it up.

答案 1 :(得分:-1)

与上述相同。

但请记住在Spring配置文件中启用Async任务(例如:applicationContext.xml):

<!-- Enable asynchronous task -->
<task:executor id="commonExecutor" pool-size="10"  />
<task:annotation-driven executor="commonExecutor"/>

或配置类:

@Configuration
@EnableAsync
public class AppConfig {
}