|
|
@@ -25,9 +25,20 @@ import org.springframework.data.domain.Sort;
|
|
|
*
|
|
|
* @author sunyj
|
|
|
* @since 2017/11/25 18:24
|
|
|
+ * @version 2018/7/6 修改下载数据的策略为按id范围端下载
|
|
|
*/
|
|
|
public class DownloadService<T> {
|
|
|
|
|
|
+ /**
|
|
|
+ * 一次下载计数器,统计一次下载的总个数,包括各个线程的
|
|
|
+ */
|
|
|
+ private static long sizeCounter = 0;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 数据文件文件名格式
|
|
|
+ */
|
|
|
+ private static final String FILE_NAME_FORMAT = "%010d.txt";
|
|
|
+
|
|
|
/**
|
|
|
* @param id 线程 id
|
|
|
* @param step 新增文件时,文件 id 的自增步长,(即线程数量)
|
|
|
@@ -40,9 +51,10 @@ public class DownloadService<T> {
|
|
|
* @return 下载的数量
|
|
|
*/
|
|
|
public long download(int id, int step, int startFileIndex, int endFileIndex, String tableName, String trueTableName, String sortField, JdbcService jdbcService) {
|
|
|
+ // 本次线程实际下载数据总数
|
|
|
long size = 0L;
|
|
|
Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
- String name = "Thread_" + id + "_" + startFileIndex + "-" + endFileIndex;
|
|
|
+ String name = "Thread_" + id + "_" + startFileIndex;
|
|
|
File file = null;
|
|
|
PrintWriter printWriter = null;
|
|
|
try {
|
|
|
@@ -50,25 +62,21 @@ public class DownloadService<T> {
|
|
|
throw new IllegalArgumentException("SINGLE_FILE_MAX_SIZE 并非 PAGE_SIZE 的整数倍:" + SINGLE_FILE_MAX_SIZE + "/" + PAGE_SIZE);
|
|
|
}
|
|
|
if (startFileIndex > endFileIndex) {
|
|
|
- logger.info(name + " startFileIndex 超过 " + endFileIndex);
|
|
|
+ logger.info(name + " startFileIndex " + startFileIndex + " 超过 endFileIndex " + endFileIndex);
|
|
|
return size;
|
|
|
}
|
|
|
Long startTime = System.currentTimeMillis();
|
|
|
logger.info(name + " 下载 " + tableName + "...");
|
|
|
|
|
|
-// Sort sort = new Sort(Sort.Direction.ASC, sortField);
|
|
|
// 分页获取数据
|
|
|
PageParams pageParams = new PageParams();
|
|
|
pageParams.setPage((startFileIndex - 1) * SINGLE_FILE_MAX_SIZE / PAGE_SIZE + 1);
|
|
|
pageParams.setSize(PAGE_SIZE);
|
|
|
- PageInfo pageInfo = new PageInfo(pageParams);
|
|
|
-// Page<T> pageResult = dao.findAll(pageInfo);
|
|
|
|
|
|
- if (GOODS_TABLE_NAME.equals(tableName) || PCB_GOODS_TABLE_NAME.equals(tableName)) {
|
|
|
- tableName = TRADE_GOODS_TABLE_NAME;
|
|
|
- }
|
|
|
-
|
|
|
- int totalFiles = (int) Math.ceil(jdbcService.getTotalElements(tableName) / (1.0 * SINGLE_FILE_MAX_SIZE));
|
|
|
+ Long maxId = jdbcService.getMaxId(tableName, sortField);
|
|
|
+ Long minId = jdbcService.getMinId(tableName, sortField);
|
|
|
+ // 理论上的总文件数
|
|
|
+ int totalFiles = (int) (maxId / SINGLE_FILE_MAX_SIZE + 1);
|
|
|
if (startFileIndex > totalFiles) {
|
|
|
logger.info(name + " startFileIndex 超过 " + totalFiles);
|
|
|
return size;
|
|
|
@@ -76,12 +84,6 @@ public class DownloadService<T> {
|
|
|
// 实际的最后一个文件
|
|
|
endFileIndex = endFileIndex < totalFiles ? endFileIndex : totalFiles;
|
|
|
|
|
|
- if (TRADE_GOODS_TABLE_NAME.equals(tableName) && GOODS_TABLE_NAME.equals(trueTableName)) {
|
|
|
- tableName = GOODS_TABLE_NAME;
|
|
|
- } else if (TRADE_GOODS_TABLE_NAME.equals(tableName) && PCB_GOODS_TABLE_NAME.equals(trueTableName)) {
|
|
|
- tableName = PCB_GOODS_TABLE_NAME;
|
|
|
- }
|
|
|
-
|
|
|
File dataDir = new File(SearchUtils.getDataPath(tableName));
|
|
|
if (!dataDir.exists()) {
|
|
|
if (!dataDir.mkdirs()) {
|
|
|
@@ -89,58 +91,46 @@ public class DownloadService<T> {
|
|
|
}
|
|
|
}
|
|
|
int fileIndex = startFileIndex;
|
|
|
- String fileName = String.format("%010d", fileIndex) + ".txt";
|
|
|
- file = new File(dataDir, fileName);
|
|
|
- printWriter = new PrintWriter(file);
|
|
|
+ String fileName = String.format(FILE_NAME_FORMAT, fileIndex);
|
|
|
+ // 当前文件已获取id区间数
|
|
|
int count = 0;
|
|
|
- if (GOODS_TABLE_NAME.equals(tableName) || PCB_GOODS_TABLE_NAME.equals(tableName)) {
|
|
|
- tableName = TRADE_GOODS_TABLE_NAME;
|
|
|
- }
|
|
|
+ // 当前文件已获取实际数据条数
|
|
|
+ int fileDataSize = 0;
|
|
|
while (endFileIndex >= fileIndex) {
|
|
|
- List<Long> ids = jdbcService.getLimitId(tableName, Sort.Direction.ASC.name(), sortField, (long) ((fileIndex - 1) * PAGE_SIZE), PAGE_SIZE);
|
|
|
- logger.info("下载id:" + ids.get(0) + "~" + ids.get(1));
|
|
|
- if (pageParams.getPage() > endFileIndex && ids.size() > 2) {
|
|
|
- break;
|
|
|
- }
|
|
|
+ Long startId = (long) ((pageParams.getPage() - 1) * pageParams.getSize() + 1);
|
|
|
+ Long endId = (long) (pageParams.getPage() * pageParams.getSize());
|
|
|
// 获取数据
|
|
|
- List<T> data = jdbcService.getData(tableName, ids.get(0), ids.get(1), sortField, Sort.Direction.ASC.name());
|
|
|
+ List<T> content = jdbcService.getData(tableName, startId, endId, sortField, Sort.Direction.ASC.name());
|
|
|
// 数据以 JSON 格式写入文件
|
|
|
- List<T> content = data;
|
|
|
- for (T element : content) {
|
|
|
- println(printWriter, element);
|
|
|
+ if (!CollectionUtils.isEmpty(content)) {
|
|
|
+ // 有数据,并且还没有创建新文件时,进行创建新文件
|
|
|
+ if (fileDataSize == 0) {
|
|
|
+ close(printWriter);
|
|
|
+ fileName = String.format(FILE_NAME_FORMAT, fileIndex);
|
|
|
+ file = new File(dataDir, fileName);
|
|
|
+ printWriter = new PrintWriter(file);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (T element : content) {
|
|
|
+ println(printWriter, element);
|
|
|
+ }
|
|
|
+
|
|
|
+ size += content.size();
|
|
|
+ fileDataSize += content.size();
|
|
|
}
|
|
|
- count += content.size();
|
|
|
- size += content.size();
|
|
|
- logger.info(name + " " + fileName + " - Downloaded..................." + size);
|
|
|
+ count += PAGE_SIZE;
|
|
|
+ logger.info("{} {} download id:{}~{}, current data size: {}, total data size: {}", name, fileName, startId, endId, content.size(), size);
|
|
|
+ pageParams.setPage(pageParams.getPage() + 1);
|
|
|
|
|
|
- // 一个文件的函数达到指定值,写入新文件
|
|
|
+ // 一个文件的获取id数达到指定值,写入新文件
|
|
|
if (count == SINGLE_FILE_MAX_SIZE) {
|
|
|
count = 0;
|
|
|
- close(printWriter);
|
|
|
+ fileDataSize = 0;
|
|
|
fileIndex += step;
|
|
|
- pageParams.setPage(pageParams.getPage() + step * SINGLE_FILE_MAX_SIZE / PAGE_SIZE);
|
|
|
- // 不创建多余文件
|
|
|
- if (endFileIndex >= fileIndex) {
|
|
|
- fileName = String.format("%010d", fileIndex) + ".txt";
|
|
|
- file = new File(dataDir, fileName);
|
|
|
- printWriter = new PrintWriter(file);
|
|
|
- }
|
|
|
- } else {
|
|
|
- pageParams.setPage(pageParams.getPage() + 1);
|
|
|
- }
|
|
|
-// pageInfo = new PageInfo(pageParams, sort);
|
|
|
-// pageResult = dao.findAll(pageInfo);
|
|
|
- // 已经下载到最后一页
|
|
|
- if (CollectionUtils.isEmpty(data)) {
|
|
|
- if (TRADE_GOODS_TABLE_NAME.equals(tableName) && GOODS_TABLE_NAME.equals(trueTableName)) {
|
|
|
- tableName = GOODS_TABLE_NAME;
|
|
|
- } else if (TRADE_GOODS_TABLE_NAME.equals(tableName) && PCB_GOODS_TABLE_NAME.equals(trueTableName)) {
|
|
|
- tableName = PCB_GOODS_TABLE_NAME;
|
|
|
- }
|
|
|
- break;
|
|
|
+ pageParams.setPage(pageParams.getPage() + (step -1) * SINGLE_FILE_MAX_SIZE / PAGE_SIZE);
|
|
|
}
|
|
|
}
|
|
|
- logger.info(String.format("%s 下载完成,耗时%.2fs\n ", name, (new Date().getTime() - startTime) / 1000.0));
|
|
|
+ logger.info(String.format("%s 下载完成,耗时%.2fs\n ", name, (System.currentTimeMillis() - startTime) / 1000.0));
|
|
|
} catch (Throwable e) {
|
|
|
close(printWriter);
|
|
|
// 出现错误时,删除最近出错的文件
|