线程池方式调用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;
}
}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ybcwjj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值