Spring Controller等待管理下一个请求的异步响应instad

时间:2016-11-23 00:13:26

标签: java spring multithreading

我有这个请求端点:

@PostMapping("/verify")
public Callable<String> verify() {
    logger.debug("----STARTED REQUEST-----");
    Callable<String> callable = () -> {
        Thread.sleep(5000);
        logger.debug("_____FINISHED REQUEST_____");
        return "foo";
    };
    logger.debug("FREED CONTROLLER");
    return callable;
}

它返回一个Callable对象,它休眠5秒钟。

我的目标:当我有多个incomming请求时,我希望它们是异步处理的。

我的意思是当第一个请求到来并且我返回一个可调用对象时,控制器在等待的同时应该处理下一个请求。但是它等待callable完成,然后才处理下一个请求。这是日志。

[nio-8080-exec-1] c.t.c.lol.task.TaskLolController         : ----STARTED REQUEST-----
[nio-8080-exec-1] c.t.c.lol.task.TaskLolController         : FREED CONTROLLER
[      MvcAsync1] c.t.c.lol.task.TaskLolController         : _____FINISHED REQUEST_____
[nio-8080-exec-3] c.t.c.lol.task.TaskLolController         : ----STARTED REQUEST-----
[nio-8080-exec-3] c.t.c.lol.task.TaskLolController         : FREED CONTROLLER
[      MvcAsync2] c.t.c.lol.task.TaskLolController         : _____FINISHED REQUEST_____
[nio-8080-exec-5] c.t.c.lol.task.TaskLolController         : ----STARTED REQUEST-----
[nio-8080-exec-5] c.t.c.lol.task.TaskLolController         : FREED CONTROLLER
[      MvcAsync3] c.t.c.lol.task.TaskLolController         : _____FINISHED REQUEST_____

我想要的是什么:

----STARTED REQUEST-----
FREED CONTROLLER
----STARTED REQUEST-----
FREED CONTROLLER
----STARTED REQUEST-----
FREED CONTROLLER
_____FINISHED REQUEST_____
_____FINISHED REQUEST_____
_____FINISHED REQUEST_____

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

使用callable方法

创建服务
@Service
private class TaskService {
    @Async
    public String execute() {
        try {
            Thread.sleep(5000);
            LOGGER.debug("_____FINISHED REQUEST_____");
            return "foo";
        } catch (InterruptedException e) {
            throw new RuntimeException();
        }
    }

}

在你的控制器中,将callable定义为`TaskService``

的execute方法
@Autowired
TaskService taskService;

@PostMapping("/verify")
public Callable<String> verify() {
    Callable<String> callable = taskservice::execute;

    logger.debug("FREED CONTROLLER");
    return callable;
}

@edit 要使@Async注释工作,我需要启用异步:

@Configuration
@EnableAsync
public class AsyncConfig extends AsyncConfigurerSupport {
    @Override
    public Executor getAsyncExecutor() {
        return Executors.newWorkStealingPool(); //will use as many threads as your processor has
    }
}

答案 1 :(得分:-3)

您在verify中使用了线程,例如:

Thread thread =  new Thread()
        {
            @Override
            public void run() 
            {
                System.out.println("Callable");
            }

        };
        thread.start();