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";
            }
        };
}
 
        

 
        


 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM