Spring 异步RESTAPI生成警告
我正在使用Spring启动应用程序。我有一个返回Callable的rest控制器Spring 异步RESTAPI生成警告,spring,spring-mvc,spring-boot,jhipster,spring-async,Spring,Spring Mvc,Spring Boot,Jhipster,Spring Async,我正在使用Spring启动应用程序。我有一个返回Callable的rest控制器 @GetMapping("/fb-roles") @Timed public Callable<List<FbRole>> getAllFbRoles() { log.debug("REST request to get all FbRoles"); return (() -> { return fbRoleRepository.findAll(); }); } }
@GetMapping("/fb-roles")
@Timed
public Callable<List<FbRole>> getAllFbRoles() {
log.debug("REST request to get all FbRoles");
return (() -> { return fbRoleRepository.findAll(); });
}
}
2018-09-19 00:43:58.434警告10104---[XNIO-2任务-28]o.s.w.c.request.async.WebAsyncManager:
!!!
需要执行器来处理java.util.concurrent.Callable返回值。
请在MVC配置中的“异步支持”下配置TaskExecutor。
当前使用的SimpleAsyncTaskExecutor不适合在负载下使用
但是,当访问api服务器时,您的警告“请在MVC配置中的“异步支持”下配置TaskExecutor。当前使用的SimpleAsyncTaskExecutor在负载下不适用”会产生以下警告
我想知道你是否使用spring mvc
对于MVC,以下几个链接可能会有所帮助:
给出了警告和可调用的
方法
Spring似乎无法识别您刚刚设置的Executor
bean
在您的配置类中
您可能需要注释您的方法并指定执行器bean名称,因此
@GetMapping("/fb-roles")
@Timed
@Async("taskExecutor")
public Callable<List<FbRole>> getAllFbRoles() {
log.debug("REST request to get all FbRoles");
return (() -> { return fbRoleRepository.findAll(); });
}
@GetMapping(“/fb角色”)
@定时
@异步(“任务执行器”)
公共可调用的getAllFbRoles(){
debug(“获取所有FBRole的REST请求”);
return(()->{return fbRoleRepository.findAll();});
}
希望这有帮助
可以在这里找到指南:Spring配置在这方面有点混乱,因为它需要对MVC异步支持进行单独的配置,即使用返回可调用的的控制器处理程序方法,以及使用@Async
注释的任何Springbean方法。要正确配置这两种配置,您可以应用如下配置,请记住,AsyncTaskExecutor
config可能需要修改:
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Bean
protected WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setTaskExecutor(getTaskExecutor());
}
};
}
@Bean
protected ConcurrentTaskExecutor getTaskExecutor() {
return new ConcurrentTaskExecutor(Executors.newFixedThreadPool(5));
}
}
另一方面,您可能想简单地用@Async
注释控制器处理程序方法。这只会产生预期的效果-释放web服务器线程-启动并忘记操作(此观察基于SpringBoot2.1.2,可能他们将来会解决此问题)。如果您想利用Servlet 3.0异步处理的强大功能,您确实必须使用可调用项
,并使用WebMVCConfiguer
对它们进行配置,我已经组合了mvc配置(xml+注释),而对于我来说,以下配置有助于修复该警告:
mvc-servlet.xml:
<mvc:annotation-driven>
<mvc:async-support default-timeout="30000" task-executor="taskExecutor"
</mvc:annotation-driven>
我正在使用JHipster generatori配置它。但是现在api返回时没有任何结果。如果您尝试删除@Timed
注释,我认为将两者结合起来会迫使api在异步结果出现之前停止更新我,如果仍然不起作用,请尝试先删除Callable和lambda表达式,然后直接返回列表。这样我们就可以知道异步是否真的工作了,希望这个帮助也可以这样尝试:@GetMapping(/fb roles”)@Async(“taskExecutor”)public List getAllFbRoles(){log.debug(“REST request to get all FbRoles”);return fbRoleRepository.findAll();}
@ArifRabbani有错误消息吗?还是只返回空结果?您确定存储库实现正确且数据存在吗?只需返回null即可。我查过存储库了,没问题。数据也存在。当我将其用作同步时,数据将成功返回。这将创建2个实例ConcurrentTaskExecutor
<mvc:annotation-driven>
<mvc:async-support default-timeout="30000" task-executor="taskExecutor"
</mvc:annotation-driven>
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Bean
public AsyncTaskExecutor taskExecutor() {
return new ConcurrentTaskExecutor(Executors.newCachedThreadPool());
}
}