package com.product.data.sync.util;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.util.CallBack;
import com.product.util.CallBackValue;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class ThreadSelectManager {
private Map<Integer, CustomResultSet> pageResultSet = new HashMap<>();
/**
* 寮€濮嬫煡璇㈤〉鏁�
*/
private int startPage;
private ExecutorService executorService;
private Connection sourceConnection;
private CallBackValue<String> getQuerySql;
private int totalPage = 0;
private CallBack<Object> setColumnNames;
private CallBackValue<String[]> getColumnNames;
public ThreadSelectManager(BatchData batchData) {
this.getQuerySql = (o) -> batchData.getQuerySql((int) o);
this.setColumnNames = (o) -> {
batchData.setColumnNames((String[]) o);
};
this.getColumnNames = (o) -> batchData.getColumnNames();
this.sourceConnection = ConnectionManager.getConnection();
this.totalPage = batchData.getTotalPage();
this.currentResult = 1;
}
/**
* 褰撳墠浠ヨ幏鍙栫鍑犻〉
*/
private int currentResult = -1;
private boolean openLog = true;
/**
* 寮€濮嬫煡璇�
*
* @return
*/
public boolean startQuery() {
//涓嶈兘閲嶅寮€濮嬫煡璇�
if (this.pageResultSet.size() <= 0 && this.executorService == null) {
this.executorService = Executors.newFixedThreadPool(1);
this.queryData();
return true;
}
return false;
}
/**
* 鑾峰彇涓嬩竴椤垫暟鎹�
*
* @return
*/
public CustomResultSet getNext() {
if (this.currentResult == -1) {
return null;
}
int page = this.currentResult;
if (this.pageResultSet.get(page) != null) {
this.currentResult++;
return this.pageResultSet.get(page);
} else {
if (!this.executorService.isTerminated()) {
try {
outPutLog("绛夊緟绾跨▼涓煡璇㈡暟鎹�....", 1);
Thread.currentThread().sleep(1500);
return this.getNext();
} catch (Exception e) {
outPutLog("绛夊緟绾跨▼涓煡璇㈡暟鎹紝鍑洪敊....", 2);
SpringMVCContextHolder.getSystemLogger().error(e);
return null;
}
} else {
this.currentResult++;
outPutLog("鏌ヨ鏁版嵁绾跨▼宸茬粨鏉燂紝娌℃湁 " + page + " 鏁版嵁", 1);
return null;
}
}
}
public static void main(String[] args) {
int total = 3313;
int i1 = total / 3;
String[] ints = new String[3];
for (int i = 1; i <= 3; i++) {
}
}
/**
* 鏌ヨ鏁版嵁
*/
private void queryData() {
outPutLog("寮€濮嬬嚎绋嬫煡璇㈡暟鎹紝闇€瑕佹煡璇細" + totalPage + " 椤垫暟鎹�", 1);
// for (int i = 0; i < 3; i++) {
this.executorService.execute(() -> {
try {
int currentPage = 1;
while (totalPage > 0) {
outPutLog("寮€濮嬫煡璇㈤〉鏁帮細" + currentPage, 1);
String querySql = getQuerySql.method(currentPage);
outPutLog("鏌ヨsql锛歕n\t" + querySql, 1);
PreparedStatement pst = sourceConnection.prepareStatement(querySql);
ResultSet resultSet = pst.executeQuery();
if (resultSet != null) {
String[] columnNames = this.getColumnNames.method(null);
CustomResultSet customResultSet = new CustomResultSet(resultSet, columnNames);
if (columnNames == null || columnNames.length <= 0) {
this.setColumnNames.method(customResultSet.getColumnNames());
}
this.pageResultSet.put(currentPage, customResultSet);
}
currentPage++;
this.totalPage--;
}
} catch (Exception e) {
e.printStackTrace();
outPutLog("绾跨▼绾跨▼鏌ヨ鏁版嵁锛屽嚭閿�....", 2);
SpringMVCContextHolder.getSystemLogger().error(e);
}
});
// }
this.executorService.shutdown();
}
/**
* 杈撳嚭鏃ュ織
*
* @param msg 娑堟伅
* @param type 绫诲瀷 1 info 2 error
*/
private void outPutLog(String msg, int type) {
if (this.openLog) {
if (type == 1) {
SpringMVCContextHolder.getSystemLogger().info(msg);
} else if (type == 2) {
SpringMVCContextHolder.getSystemLogger().error(msg);
}
}
}
}