Spring Boot中的异步方法

时间:2017-04-25 09:58:50

标签: rest asynchronous spring-boot

发送带有注释为@Async的方法的电子邮件时遇到问题。 首先,我不确定是否可以按照我的意愿工作,所以我需要帮助解释。

以下是我现在正在做的事情:

在main方法中我有注释

@EnableAsync(proxyTargetClass = true)

接下来我有AsyncConfig类

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import java.util.concurrent.Executor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(2);
        executor.setQueueCapacity(500);
        executor.setThreadNamePrefix("email-");
        executor.initialize();
        return executor;
    }

}

当然,它的休息应用所以我有控制器,服务等,看起来很正常,没什么特别的

我的异步方法如下所示:

    @Async
    public void sendEmail() throws InterruptedException {

        log.info("Sleep");
        Thread.sleep(10000L);    
        //method code
        log.info("Done");
    }

我在另一种服务方法中执行此方法:

@Override
    public boolean sendSystemEmail() {

        try {
            this.sendEmail();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        log.info("pending sendEmail method");
        return true;
    }

现在我想要归档的是忽略执行sendEmail()函数并执行return true;同时函数sendEmail()将在另一个Thread中执行。当然,它现在并不像我想的那样工作。不幸的是

请注意,我是异步编程的新手,所以我对这种编程方法的某些部分缺乏了解。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

首先 - 让我们回顾一下规则 - @Async有两个限制:

它必须仅适用于公共方法 自调用 - 从同一个类中调用异步方法 - 将无法正常工作

原因很简单 - 该方法需要公开才能被代理。并且自我调用不起作用,因为它绕过代理并直接调用底层方法。

http://www.baeldung.com/spring-async