SpringBoot+springmvc异步处理请求

有两种情况,第一种是业务逻辑复杂,但不需要业务逻辑的结果,第二种是需要返回业务逻辑的处理结果

第一种比较简单,利用多线程处理业务逻辑,或者利用spring中@Asyn注解更简单,

使用@Asyn注解,要首先要配置开启异步注解

  1. @Configuration
  2. @EnableAsync
  3. public class AsyncConfig {
  4. }

然后直接在方法上注解即可

  1. @Service
  2. public class AsyncAction {
  3. @Async
  4. public void fun1() {
  5. try {
  6. Thread.sleep(10000);
  7. } catch (InterruptedException e) {
  8. // TODO Auto-generated catch block
  9. e.printStackTrace();
  10. }
  11. System.out.println("fun1");
  12. }
  13. }


切记异步类的bean不能被重复扫描,而且只能被sping容器的上下文扫描,不能被spingmvc扫描,否则异步失效

第二种需要返回业务逻辑情况则首先需要开启异步支持

  1. public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  2. @Override
  3. protected void customizeRegistration(Dynamic registration) {
  4. registration.setAsyncSupported(true);
  5. }
或者在web.xml中开启

  1. <servlet>
  2. <servlet-name>SpringMvc</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>...</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. <async-supported>true</async-supported>
  10. </servlet>

然后配置一下线程池

  1. @Configuration
  2. @EnableWebMvc
  3. @ComponentScan("spittr.web")
  4. public class WebConfig extends WebMvcConfigurerAdapter {
  5. @Override
  6. public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
  7. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  8. executor.setCorePoolSize(5);
  9. executor.setMaxPoolSize(10);
  10. executor.setQueueCapacity(50);
  11. executor.setThreadNamePrefix("abc-");
  12. executor.setKeepAliveSeconds(30);
  13. configurer.setTaskExecutor(executor);
  14. configurer.setDefaultTimeout(600);
  15. }
  1. @Configuration
  2. @EnableWebMvc
  3. @ComponentScan("spittr.web")
  4. public class WebConfig extends WebMvcConfigurerAdapter {


这样就可以开始异步处理任务了,能够尽快释放servlet线程,缓解高并发问题

  1. @RequestMapping(value = "/async")
  2. public @ResponseBody Callable<String> async() {
	return new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(2000);
                return "Callable result";
            }
        };
}






            
posted @ 2018-07-18 15:31  星朝  阅读(3820)  评论(0编辑  收藏  举报