//調用工具主類
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);
}
}