package com.nis.util.excel.thread; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.LinkedBlockingQueue; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import com.beust.jcommander.internal.Lists; import com.nis.domain.basics.AsnGroupInfo; import com.nis.domain.basics.AsnIpCfg; import com.nis.domain.specific.ConfigGroupInfo; import com.nis.util.AsnCacheUtils; import com.nis.util.Constants; import com.nis.web.dao.basics.AsnGroupInfoDao; import com.nis.web.dao.basics.AsnIpCfgDao; import com.nis.web.dao.specific.ConfigGroupInfoDao; import com.nis.web.service.SpringContextHolder; import com.nis.web.service.basics.AsnIpCfgService; public class DeleteAsnIpTread implements Callable { private BlockingQueue asnNos; private AsnGroupInfoDao asnGroupInfoDao; private ConfigGroupInfoDao configGroupInfoDao; private AsnIpCfgDao asnIpCfgDao; public DeleteAsnIpTread(BlockingQueue asnNos) { this.asnNos=asnNos; this.asnGroupInfoDao=SpringContextHolder.getBean(AsnGroupInfoDao.class); this.configGroupInfoDao=SpringContextHolder.getBean(ConfigGroupInfoDao.class); this.asnIpCfgDao=SpringContextHolder.getBean(AsnIpCfgDao.class); } @Override public Throwable call() throws Exception { // TODO Auto-generated method stub List asnNoList=Lists.newArrayList(); List asnIds=Lists.newArrayList(); DataSourceTransactionManager transactionManager=(DataSourceTransactionManager)SpringContextHolder.getBean("transactionManager"); LinkedBlockingQueue toDelAndSendAsnIpCfgs=new LinkedBlockingQueue(); List configGroupInfos=configGroupInfoDao.findAllList(4); while(!asnNos.isEmpty()) { asnNos.drainTo(asnNoList,5); for(Long asnNo:asnNoList) { AsnGroupInfo configGroupInfo=AsnCacheUtils.get(asnNo); if(configGroupInfo==null) { configGroupInfo=new AsnGroupInfo(); configGroupInfo.setAsnId(asnNo); configGroupInfo=asnGroupInfoDao.getInfoByAsnNo(configGroupInfo); } for(ConfigGroupInfo cinfo:configGroupInfos) { if(cinfo.getGroupId().intValue()==configGroupInfo.getGroupId().intValue()) { if(cinfo.getIsIssued()==1) {//已下发 List _toDelAsnIpCfgs=asnIpCfgDao.getByAsnNo(configGroupInfo.getAsnId()); toDelAndSendAsnIpCfgs.addAll(_toDelAsnIpCfgs); }else { asnIds.add(asnNo); } break; } } } if(asnIds.size()>0) { this.deleteByAsnNo(asnIds); } if(!toDelAndSendAsnIpCfgs.isEmpty()) { Integer size = toDelAndSendAsnIpCfgs.size(); int pointsDataLimit = Constants.MAAT_JSON_SEND_SIZE;//限制条数 List listPage=Lists.newArrayList(Constants.MAAT_JSON_SEND_SIZE); while(!toDelAndSendAsnIpCfgs.isEmpty()) { //开启一个新事物 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务,这样会比较安全些。 TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态 try { toDelAndSendAsnIpCfgs.drainTo(listPage, Constants.MAAT_JSON_SEND_SIZE); StringBuilder sb=new StringBuilder(); for(AsnIpCfg ip:listPage) { sb.append(ip.getCfgId()); sb.append(","); } sb.deleteCharAt(sb.toString().lastIndexOf(",")); asnIpCfgDao.delete(sb.toString()); new AsnIpCfgService().asnIPRegionSendToMaat(listPage, Constants.VALID_NO); transactionManager.commit(status); listPage.clear(); } catch (Throwable e) { // TODO: handle exception transactionManager.rollback(status); throw e; } } } asnNoList.clear(); asnIds.clear(); } return null; } public void deleteByAsnNo(List asnNoList) { int pointsDataLimit = 1000;//限制条数 Integer size = asnNoList.size(); if(pointsDataLimit listPage = asnNoList.subList(0, pointsDataLimit); StringBuilder asnNoStr=new StringBuilder(); for(Long asnNo:asnNoList) { asnNoStr.append(asnNo); asnNoStr.append(","); } int result=0; do { result=asnIpCfgDao.deleteByAsnId(asnNoStr.toString().substring(0,asnNoStr.toString().length()-1)); }while(result>0); //剔除 asnNoList.subList(0, pointsDataLimit).clear(); } if(!asnNoList.isEmpty()){ StringBuilder asnNoStr=new StringBuilder(); for(Long asnNo:asnNoList) { asnNoStr.append(asnNo); asnNoStr.append(","); } int result=0; do { result=asnIpCfgDao.deleteByAsnId(asnNoStr.toString().substring(0,asnNoStr.toString().length()-1)); }while(result>0); asnNoList.clear(); } }else { StringBuilder asnNoStr=new StringBuilder(); for(Long asnNo:asnNoList) { asnNoStr.append(asnNo); asnNoStr.append(","); } int result=0; do { result=asnIpCfgDao.deleteByAsnId(asnNoStr.toString().substring(0,asnNoStr.toString().length()-1)); }while(result>0); asnNoList.clear(); } } }