有两种情况,第一种是业务逻辑复杂,但不需要业务逻辑的结果,第二种是需要返回业务逻辑的处理结果
第一种比较简单,利用多线程处理业务逻辑,或者利用spring中@Asyn注解更简单,
使用@Asyn注解,要首先要配置开启异步注解
public class AsyncConfig {
}
然后直接在方法上注解即可
public class AsyncAction {
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 {
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>
然后配置一下线程池
"spittr.web")
(
public class WebConfig extends WebMvcConfigurerAdapter {
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);
}
"spittr.web")
(
public class WebConfig extends WebMvcConfigurerAdapter {
"/async")
(value =
public Callable<String> async() {
return new Callable<String>() { @Override public String call() throws Exception { Thread.sleep(2000); return "Callable result"; } };}