Rest Controller 中的@Async 不起作用
@Async in Rest Controller not working
我正在开发 REST API 并希望将其作为异步 Rest 控制器,
所以我的控制器在下面:
@RestController
@Async
public class ApiController {
List<ApiObject> apiDataList;
@RequestMapping(value="/data",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
public ResponseEntity<List<ApiObject>> getData(){
List<ApiObject> apiDataList=getApiData();
return new ResponseEntity<List<ApiObject>>(apiDataList,HttpStatus.OK);
}
@ResponseBody
public List<ApiObject> getApiData(){
List<ApiObject> apiDataList3=new List<ApiObject> ();
//do the processing
return apiDataList3;
}
}
然后在 Spring 引导应用程序 class 我创建为
@SpringBootApplication
@EnableScheduling
@EnableCaching
@EnableAsync
public class APIApplication {
public static void main(String[] args) {
SpringApplication.run(APIApplication.class, args);
}
}
之后,在 server.xml 中,我尝试添加 Nio 连接器,如下所示:
<Connector maxThreads="1000" port="8080" protocol="org.apache.coyote.http11.Http11Nioprotocol"
connectionTimeout="20000"
redirectPort="8443" />
但应用程序启动但响应是empty.Any感谢帮助
@Async 应该按方法注释(不是class)。
您已将其注释为 class
@Async
public class ApiController {
您必须仅指定方法(方法的调用者不会等待)
示例:
@Async
public void asyncMethodWithVoidReturnType(){
System.out.println("Execute method asynchronously. "
+ Thread.currentThread().getName());
}
执行者注意事项
在 spring 引导中,最好使用 bean 并在 @Async
annotation
中指定 Executor
执行器 Bean
@Configuration
@EnableAsync
public class SpringAsyncConfig {
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
return new ThreadPoolTaskExecutor();
}
}
Executor Bean的使用
@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {
System.out.println("Execute method with configured executor - "
+ Thread.currentThread().getName());
}
或者如果你必须使用 xml
<task:executor id="threadPoolTaskExecutor" pool-size="5" />
<task:annotation-driven executor="threadPoolTaskExecutor"/>
详细文档可以看here
我正在开发 REST API 并希望将其作为异步 Rest 控制器, 所以我的控制器在下面:
@RestController
@Async
public class ApiController {
List<ApiObject> apiDataList;
@RequestMapping(value="/data",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
public ResponseEntity<List<ApiObject>> getData(){
List<ApiObject> apiDataList=getApiData();
return new ResponseEntity<List<ApiObject>>(apiDataList,HttpStatus.OK);
}
@ResponseBody
public List<ApiObject> getApiData(){
List<ApiObject> apiDataList3=new List<ApiObject> ();
//do the processing
return apiDataList3;
}
}
然后在 Spring 引导应用程序 class 我创建为
@SpringBootApplication
@EnableScheduling
@EnableCaching
@EnableAsync
public class APIApplication {
public static void main(String[] args) {
SpringApplication.run(APIApplication.class, args);
}
}
之后,在 server.xml 中,我尝试添加 Nio 连接器,如下所示:
<Connector maxThreads="1000" port="8080" protocol="org.apache.coyote.http11.Http11Nioprotocol"
connectionTimeout="20000"
redirectPort="8443" />
但应用程序启动但响应是empty.Any感谢帮助
@Async 应该按方法注释(不是class)。 您已将其注释为 class
@Async
public class ApiController {
您必须仅指定方法(方法的调用者不会等待)
示例:
@Async
public void asyncMethodWithVoidReturnType(){
System.out.println("Execute method asynchronously. "
+ Thread.currentThread().getName());
}
执行者注意事项
在 spring 引导中,最好使用 bean 并在 @Async
annotation
执行器 Bean
@Configuration
@EnableAsync
public class SpringAsyncConfig {
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
return new ThreadPoolTaskExecutor();
}
}
Executor Bean的使用
@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {
System.out.println("Execute method with configured executor - "
+ Thread.currentThread().getName());
}
或者如果你必须使用 xml
<task:executor id="threadPoolTaskExecutor" pool-size="5" />
<task:annotation-driven executor="threadPoolTaskExecutor"/>
详细文档可以看here