如何在Spring MVC中使用多线程概念进行后续操作

时间:2016-08-29 07:21:52

标签: java spring-mvc

我想在我的网络应用程序中成功更新配置文件后发送电子邮件并更新活动日志。为了发送邮件和更新活动日志,我想使用线程,以便可以立即将配置文件更新响应发送回客户端,并且线程可以处理子后续操作。请建议实施。

2 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一点,因为它是一个Spring MVC应用程序几乎无关紧要。

如果你正在使用Java 8,那么你可以简单地调用执行程序服务从它的池中给你一个线程:

    String emailAddress = //get email address...
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    executorService.submit(() -> {
       emailService.sendNotification(emailAddress); 
    });

Pre-Java 8:

final String emailAddress = "";
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        emailService.sendNotification(emailAddress);
    }
});
thread.start();

如果您正在创建一个更复杂的应用程序,那么您应该考虑使用消息队列(ActiveMQ是好的)。这使您可以在添加更多异步任务时获得更多控制和可见性,并且可以很好地扩展,这也意味着如果同时有大量注册,您将不会使应用程序服务器饿死。

答案 1 :(得分:1)

您可以使用BlockingQueue并实现生产者 - 消费者模型来解决问题。您的现有程序充当生产者,它将一个令牌添加到BlockingQueue中,执行程序(由Executors.newFixedThreadpool创建)可以执行所有后续操作。您可以引用Javadoc并创建Spring上下文(作为XML或注释)。

您也可以参考CompletionSerive

在保存个人资料时生成要发送和发送电子邮件的帖子并不是一个好主意。因为它可能导致太多线程和上下文切换可能导致完成延迟。因此建议使用固定线程池。

可以使用JMS队列。但对于给定的场景,它看起来有点过分。因此建议使用BlockingQueue。