线程池方式调用spring mvc的业务类的简单实例
開發環境: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
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的线程池方式调用spring mvc的业务类的简单实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3: 数字日期和时间(1)
- 下一篇: mybatisplus逻辑删除