开发环境: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;
}
}
以上如有错误之处,请大神们多多指教!!!