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

第一种比较简单,利用多线程处理业务逻辑,或者利用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";
}
};

}




最新文章

  1. 使用Python解析JSON数据的基本方法
  2. Dagger2 使用初步
  3. Spring配置数据源的几种形式
  4. GTD时间管理---非行动性
  5. (转)mysql各个主要版本之间的差异
  6. springBoot学习
  7. android的原理--为什么我们不需要手动关闭程序
  8. Python 操作 MySQL--(pymysql)
  9. 使用 win10 的正确姿势
  10. MySQL 存储过程探秘
  11. FFmpeg 学习(六):FFmpeg 核心模块 libavformat 与 libavcodec 分析
  12. C++程序设计方法3:数组下标运算符重载
  13. 安装stress模拟linux系统资源消耗
  14. SQL多表查询总结
  15. 性能测试loadrunner安装
  16. Rsync匿名访问漏洞
  17. (转) Docker EE/Docker CE简介与版本规划
  18. Mysql的TIMESTAMPDIFF和TIMESTAMPADD的用法
  19. C# : 资源文件(多用于处理国际化)
  20. 小米5安装Xposed框架——需要解锁刷机

热门文章

  1. Java中Socket上的Read操作堵塞问题
  2. Linux samba服务器安装调试。
  3. UVC和V4L2的关系(转载)
  4. web安全:防范点击劫持的两种方式
  5. jmind-redis一个redis的nio客户端
  6. 洛谷 P1964 【mc生存】卖东西
  7. ethercat主站控制软件TwinCAT的安装
  8. Android_L(64bit) 模拟器配置及创建项目
  9. Eclipse怎么导入外来项目
  10. [Codeforces558E]A Simple Task 线段树