//调用工具主类
package com.zycfc.mpc.process.util;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.springframework.transaction.TransactionStatus;
public class Execute {
public static void batchDeal(List<?> data, int batchNum) throws Exception {
int totalNum = data.size();
int pageNum = totalNum % batchNum == 0 ? totalNum / batchNum : totalNum / batchNum + 1;
ExecutorService executor = Executors.newFixedThreadPool(pageNum);
TransactionStatus transactionStatus=null;
try {
CountDownLatch countDownLatch = new CountDownLatch(pageNum);
List subData = null;
int fromIndex, toIndex;
for (int i = 0; i < pageNum; i++) {
fromIndex = i * batchNum;
toIndex = Math.min(totalNum, fromIndex + batchNum);
subData = data.subList(fromIndex, toIndex);
ImportTask task = new ImportTask(fromIndex,toIndex-1,subData, countDownLatch);
executor.execute(task);
}
// 主线程必须在启动其它线程后立即调用CountDownLatch.await()方法,
// 这样主线程的操作就会在这个方法上阻塞,直到其它线程完成各自的任务。
// 计数器的值等于0时,主线程就能通过await()方法恢复执行自己的任务。
countDownLatch.await();
System.out.println("执行完毕");
//logger.info("数据操作完成!可以在此开始其它业务");
}finally {
// 关闭线程池,释放资源
executor.shutdown();
}
}
}
//具体的线程业务执行,根据自己的需要剔除一些代码哈
package com.zycfc.mpc.process.util;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import org.assertj.core.util.Lists;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import com.zycfc.mpc.core.orm.smschan.domain.TMpcSmsChan;
import com.zycfc.mpc.core.orm.smschan.service.TMpcSmsChanService;
import com.zycfc.mpc.process.MpcPo;
import com.zycfc.zsf.boot.core.common.SpringContextHelper;
import com.zycfc.zsf.boot.id.IdGenerator;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ImportTask implements Runnable {
private List<MpcPo> list;
private CountDownLatch countDownLatch;
public int fromIndex;
public int toIndex;
public ImportTask(int fromIndex, int toIndex, List<MpcPo> list, CountDownLatch countDownLatch) {
this.list = list;
this.countDownLatch = countDownLatch;
this.fromIndex = fromIndex;
this.toIndex = toIndex;
}
public TransactionStatus transactionStatus;
public DataSourceTransactionManager dataSourceTransactionManager;
@Override
public void run() {
try {
dataSourceTransactionManager = SpringContextHelper.getBean(DataSourceTransactionManager.class);
TransactionDefinition transactionDefinition = SpringContextHelper.getBean(TransactionDefinition.class);
transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
TMpcSmsChanService tMpcSmsChanService = (TMpcSmsChanService) SpringContextHelper
.getBean("TMpcSmsChanService");
IdGenerator idGenerator =(IdGenerator )SpringContextHelper
.getBean("idGenerator");
List<TMpcSmsChan> listChan = Lists.newArrayList();
for (MpcPo mpcPo : list) {
// 先更新
String smsNo = mpcPo.getSmsNo();
Set<String> split = dealRepeat(mpcPo.getChanNo());
for (String string : split) {
TMpcSmsChan chan = new TMpcSmsChan();
chan.setSmsNo(mpcPo.getSmsNo());
chan.setChanNo(string);
chan.setCreateUser("xhxadmin");
String generate = SerialNum.getMoveOrderNo();
System.out.println("生成"+generate);
chan.setId(generate);
listChan.add(chan);
}
}
tMpcSmsChanService.addBatch(listChan);
dataSourceTransactionManager.commit(transactionStatus);// 提交
System.out.println(fromIndex+"插入成功"+toIndex);
} catch (Exception e) {
if (transactionStatus != null) {
dataSourceTransactionManager.rollback(transactionStatus);
}
e.printStackTrace();
System.out.println(fromIndex+"插入失败"+toIndex);
}
// 发出线程任务完成的信号
countDownLatch.countDown();
}
public static Set<String> dealRepeat(String str) {
String[] split = str.split(",");
Map<String,String> map=new HashMap<String,String>();
for (String string : split) {
map.put(string, string);
}
Set<String> keySet = map.keySet();
return keySet;
}
}
SpringContextHelper类
package com.java.batch;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextHelper implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHelper.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}