有两种情况,第一种是业务逻辑复杂,但不需要业务逻辑的结果,第二种是需要返回业务逻辑的处理结果
第一种比较简单,利用多线程处理业务逻辑,或者利用spring中@Asyn注解更简单,
使用@Asyn注解,要首先要配置开启异步注解
-
@Configuration
-
@EnableAsync
-
public class AsyncConfig {
-
-
}
然后直接在方法上注解即可
-
@Service
-
public class AsyncAction {
-
-
@Async
-
public void fun1() {
-
try {
-
Thread.sleep(10000);
-
} catch (InterruptedException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
System.out.println("fun1");
-
}
-
}
第二种需要返回业务逻辑情况则首先需要开启异步支持
-
public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
-
@Override
-
protected void customizeRegistration(Dynamic registration) {
-
registration.setAsyncSupported(true);
-
}
或者在web.xml中开启
-
<servlet>
-
<servlet-name>SpringMvc</servlet-name>
-
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
-
<init-param>
-
<param-name>contextConfigLocation</param-name>
-
<param-value>...</param-value>
-
</init-param>
-
<load-on-startup>1</load-on-startup>
-
<async-supported>true</async-supported>
-
</servlet>
然后配置一下线程池
-
@Configuration
-
@EnableWebMvc
-
@ComponentScan("spittr.web")
-
public class WebConfig extends WebMvcConfigurerAdapter {
-
-
@Override
-
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
-
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
-
executor.setCorePoolSize(5);
-
executor.setMaxPoolSize(10);
-
executor.setQueueCapacity(50);
-
executor.setThreadNamePrefix("abc-");
-
executor.setKeepAliveSeconds(30);
-
configurer.setTaskExecutor(executor);
-
configurer.setDefaultTimeout(600);
-
}
-
@Configuration
-
@EnableWebMvc
-
@ComponentScan("spittr.web")
-
public class WebConfig extends WebMvcConfigurerAdapter {
-
@RequestMapping(value = "/async")
-
-
public @ResponseBody Callable<String> async() {
return new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(2000);
return "Callable result";
}
}; }