我有这个请求端点:
@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_____
我怎样才能做到这一点?
答案 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();