开发环境:springmvc

业务场景: 大字段附件从数据表中迁移到 另外一张表保存文件路径并存储文件到磁盘 的小程序。

实现目标:通过url 直接调用一次运行即可成功: http:ip:port/webappname/clfj/transFj.do ,通过多线程方式执行


//控制类

@Controller
@RequestMapping("/clfj")
public class ClfjController {

AtomicInteger count= new AtomicInteger(0);// 统计迁移总数类

private static final Logger logger = LoggerFactory.getLogger(ClfjController.class);

@Autowired
private ClFjService clFjService; //处理数据库和上传文件的业务类

/**
* 原大字段的附件 迁移到外面 CL_FJ
*
* @author Administrator
* @param response
* @param request
* @throws Exception
*/
@RequestMapping("/transFj.do")
public void transFj(HttpServletResponse response, HttpServletRequest request) throws Exception {
/查询 需要转移的数据
List<Map<String, Object>> list = clFjService.queryKfWtFj();

// 构建线程池
ExecutorService pools = Executors.newFixedThreadPool(5);
// 创建可以返回执行结果的线程类
CompletionService<String> completionService = new ExecutorCompletionService<String>(pools);
for(Map<String,Object> map:list)
{ try {
//提交需要单独执行的每个线程类,业务类作为参数传递
completionService.submit(new TransJobThread(map,clFjService));
}catch(Exception e) {
logger.error("====error submit job:",e);
}
}

for(int i=0;i<list.size();i++)
{
try {
//获取每个线程执行的结果
String rtn= completionService.take().get();
if(rtn.startsWith("ok"))
{
logger.debug("完成第"+count.incrementAndGet()+"条,"+rtn);
}

}catch(Exception e) {
logger.error("====error completionService.take().get():",e);
}
}

try {
//关闭线程池
pools.shutdown();
pools.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
} catch (InterruptedException e) {
logger.error("=======关闭线程池:"+e.getMessage());
}
logger.debug("======完成====");

}
}


// 单个线程迁移业务执行模块
public class TransJobThread implements Callable<String> {
private Map<String,Object> mapObject = null;

private ClFjService clFjService;

public TransJobThread(Map<String, Object> map,ClFjService clFjService) {
this.mapObject = map;
this.clFjService = clFjService;
}

public String call() {
String nd = UtilComm.trim((String) mapObject.get("ND"));
String xh = String.valueOf(((Integer) mapObject.get("XH")));
String filename = nd + "-" + xh + ".doc";
String ret = clFjService.transSingleFj(filename, nd, xh, "KF");
return ret;
}
}


以上如有错误之处,请大神们多多指教!!!

转载于:https://www.cnblogs.com/yinbaicheng/p/10342976.html

线程池方式调用spring mvc的业务类的简单实例相关推荐

  1. Java线程池实现原理及其在美团业务中的实践

    来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...

  2. 【有料】Java线程池实现原理及其在美团业务中的实践

    随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员 ...

  3. Java线程池实现原理及其在美团业务中的实践(转载加总结)

    我们知道线程有5种状态分别是新建,就绪,运行,阻塞,死亡,而对应的线程池也有5种状态RUNNING运行,线程池创建就是该状态,SHUTDOWN 不接受新任务,但是处理已存在的任务,STOP不接受新任务 ...

  4. 《C#多线程编程实战(原书第2版)》——3.2 在线程池中调用委托

    本节书摘来自华章出版社<C#多线程编程实战(原书第2版)>一书中的第3章,第3.2节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问 ...

  5. (原创)使用AsyncTask(带修改线程池方式)+自定义ImageLoader+LRU算法对图片三级缓存及其显示优化(只有在ListView滑动停止的时候才去网络请求获取图片数据)

    前言: 以前看了些关于图片优化处理缓存比较全的视频(感谢慕风网),现在回顾觉得还是挺好的也就总结出来下,感觉针对图片做处理这块还真的用的比较多,本文章只要使用异步线程AsyncTask.自定义的Ima ...

  6. java配置springmvc_Java方式配置Spring MVC

    概述 使用Java方式配置Spring MVC,以及回顾一下Spring MVC的各种用法. Spring MVC简述 关于Spring MVC的介绍网上有很多,这里就不再赘述了,只是要说一下,Spr ...

  7. Spring框架学习笔记08:基于Java配置方式使用Spring MVC

    文章目录 一.基于Java配置与注解的方式使用Spring MVC 1.创建Maven项目 - SpringMVCDemo2020 2.在pom.xml文件里添加相关依赖 3.创建日志属性文件 - l ...

  8. Spring框架学习笔记07:基于XML配置方式使用Spring MVC

    文章目录 一.Spring MVC概述 1.MVC架构 2.Spring MVC 3.使用Spring MVC的两种方式 二.基于XML配置与注解的方式使用Spring MVC (一)创建Spring ...

  9. [zz]Spring MVC 之 SimpleFormController类別

    [zz]Spring MVC 之 SimpleFormController类別 SimpleFormController类別 Spring附有一些简单的窗体处理handler,这些handler都实现 ...

最新文章

  1. Linux08--Shell程序设计03 shell script
  2. 对NumPy中dot()函数的理解(亲测,矩阵算法)
  3. C#-获取某变量类型的默认值
  4. 【MySQL】MySQL删除数据库的时候卡死
  5. STM32工作笔记0048---Systick滴答定时器---延时函数讲解
  6. 使用mpx开发外卖小程序
  7. idea 初始界面_IDEA 初始配置教程
  8. 微软云平台 Azure简介 (三)Windows Azure 存储概述
  9. python set_Python Set联合
  10. JVM 为什么使用元空间替换了永久代?
  11. 自学JQuery Mobile的几个例子
  12. php tpshop,TPshop是什么意思?
  13. Android 关于所谓的 深度睡眠 的问题
  14. 通用流量办什么卡划算?告诉你三大运营商该如何选择?
  15. Win11下载速度太慢如何解决?Win11提高下载速度的方法
  16. 台式计算机和笔记本,大一买买笔记本还是台式电脑好?
  17. IT教育大反思之一:多元化是IT教育的必然之路
  18. 7-3 生化危机 (20 分)java版
  19. 多线程永动任务设计与实现
  20. Android 自定义DatePick 只显示年月,日期选择年月

热门文章

  1. servlet——请求乱码问题解决
  2. leetcode C++ 39. 组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 c
  3. 4、PPT图表的制作(制作九宫格图片、更好看的图表)
  4. 谱聚类算法(Spectral Clustering)优化与扩展
  5. MATLAB中sort函数对矩阵数进行排序
  6. tomcat启动完成执行 某个方法 定时任务(Spring)
  7. 四、Java多人博客系统-2.0版本
  8. STM32 SPI的使用
  9. SpringMVC注解@RequestParam全面解析
  10. 2016年工作中遇到的问题31-40