ExecutorService exec = Executors.newCachedThreadPool(); //创建线程池
Long startTime = System.currentTimeMillis();.//定义开始时间
for (OrderMasterDO orderMasterDO : listBeam) { //一个业务的增强FOR循环 循环开启线程
Runnable task = new Runnable() { //new 一个线程
@Override
public void run() {//线程需要执行的方法
BspRequestXml r = new BspRequestXml();
r.setService("OrderService");
r.setHead(info.getClintCode());
BspOrderXml o = new BspOrderXml();
List<BspOrderCargoXml> bspOrderCargoXmlList = new ArrayList();
BspOrderCargoXml xml = new BspOrderCargoXml();
xml.setName(orderMasterDO.getCargo());
bspOrderCargoXmlList.add(xml);
o.setBspOrderCargoXmlList(bspOrderCargoXmlList);
o.setOrderId(orderMasterDO.getOrderId());
o.setParcelQuantity("1");
// 寄件人信息均为可配置项
o.setJAddress(info.getDef1());
o.setJContact(info.getJContact());
o.setJTel(info.getJTel());
o.setDAddress(orderMasterDO.getDAddress());
o.setDContact(orderMasterDO.getDContact());
// 此处判断订单内是否有记录快递类型 首选订单内属性 次选后台配置
if (orderMasterDO.getServiceType() != null || !"".equals("")) {
o.setServiceType(orderMasterDO.getServiceType());
} else {
o.setServiceType(info.getExpressType());
}
o.setDTel(orderMasterDO.getDTel());
o.setExpressType(info.getExpressType());// 可配置项
o.setPayMethod(info.getPayMethed());// 可配置项
// 此处逻辑修改为 如果有微信月结卡号 则用微信 否则普通月结卡号
BspBodyXml b = new BspBodyXml();
b.setBspOrderXml(o);
r.setBspBodyXml(b);
XStream x = new XStream();
XStream xstream = new XStream(new DomDriver("utf8"));
xstream.processAnnotations(r.getClass()); // 识别obj类中的注解
String request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ xstream.toXML(r);
request = request.replace("__", "_");
String response = bsp.BspService(
"http://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService", request,
info.getClintCode(), info.getClintCheke());
// String xml = getXmlToSend(result, info.getClintCheke());
// String respose =
// BspServiceImpl.sendPost("http://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService",
// xml);
// StaticLog.info("请求报文--" + request);
// StaticLog.info("返回报文--" + response);
orderMasterDO.setRequest(request);
orderMasterDO.setResponse(response);
// master.setPayMethod(info.getPaymethed());
// master.setCargo(info.getCargo());
// master.setCargoNum(1);
// master.setExpressType(info.getExpresstype());
orderMasterDO.setBspTime(new Date());
BspResponseXml resp = BspHelper.getBspResponseXml(response);
String result = resp.getHead();
if (result.equals("OK")) {
String mailno = resp.getBspResponseBodyXml().getBspOrderResponseXml()
.getMailno();
orderMasterDO.setMailnoState("1");
orderMasterDO.setMailno(mailno);
success.add(orderMasterDO.getId());
} else {
resp.getERROR();
orderMasterDO.setMailnoState("4");
orderMasterDO.setErrMsg(resp.getERROR());
}
try {
orderMasterDao.update(orderMasterDO);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
exec.submit(task);//交给开启的线程池执行线程
}
exec.shutdown();//循环外关闭线程
try {
exec.awaitTermination(1, TimeUnit.SECONDS);//设置线程空闲后默认销毁时间 1秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while (true) {
if (exec.isTerminated()) {//这里是一个异步校验 死循环查询线程是否全部结束
StaticLog.info("操作完成");
break;//如果线程全部执行完成推出
}
}
Long endTime = System.currentTimeMillis();//结束时间
System.out.println("用时" + (endTime - startTime) / 1000 + "秒");
StaticLog.info("开始执行垃圾回收");
System.gc();
StaticLog.info("垃圾回收完毕 返回页面");
return success;
自己记录 自用
因为service 默认是单例的 所以不会引起多次调用方法引起的线程不安全问题
该线程简单的执行update 操作 目前没有影响