Rest Controller中的@Async无法正常工作

时间:2017-05-18 00:40:29

标签: asynchronous spring-boot controller spring-restcontroller

我正在开发一个REST API,并希望将其作为异步Rest Controller, 所以我的控制器如下:

@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引导应用程序类中

@SpringBootApplication
@EnableScheduling
@EnableCaching
@EnableAsync

public class APIApplication {

    public static void main(String[] args) {
        SpringApplication.run(APIApplication.class, args);
    }


}

之后在server.xml中我尝试添加Nio Connector,如下所示:

<Connector maxThreads="1000" port="8080" protocol="org.apache.coyote.http11.Http11Nioprotocol"
               connectionTimeout="20000"
               redirectPort="8443" />

但应用程序启动但响应为空。感谢任何帮助

1 个答案:

答案 0 :(得分:1)

@Async应该按方法注释(不是类)。 你已经为类

注释了它
@Async
public class ApiController {

您必须仅指定方法(方法的调用者不会等待)

示例:

@Async
public void asyncMethodWithVoidReturnType(){
    System.out.println("Execute method asynchronously. "
      + Thread.currentThread().getName());
}

执行者的注释 在spring boot中,最好使用bean并在@Async注释

中指定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