Your Name
2023-06-17 c767e8fed06850e13490ac9e4fa09dabc0aa33f5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.java110.job.export;
 
import com.java110.core.client.FileUploadTemplate;
import com.java110.core.log.LoggerFactory;
import com.java110.dto.data.ExportDataDto;
import com.java110.dto.user.UserDownloadFileDto;
import com.java110.intf.job.IUserDownloadFileV1InnerServiceSMO;
import com.java110.po.user.UserDownloadFilePo;
import com.java110.utils.factory.ApplicationContextFactory;
import com.java110.utils.util.ExceptionUtil;
import com.java110.utils.util.StringUtil;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.slf4j.Logger;
 
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * 导出数据执行器
 */
public class ExportDataExecutor implements Runnable {
    private static final Logger log = LoggerFactory.getLogger(ExportDataQueue.class);
 
    private IUserDownloadFileV1InnerServiceSMO userDownloadFileV1InnerServiceSMOImpl;
 
    private FileUploadTemplate fileUploadTemplate;
 
    //默认线程大小
    private static final int DEFAULT_EXPORT_POOL = 4;
 
    private boolean isRun = false;
 
    public ExportDataExecutor(boolean isRun) {
 
        this.isRun = isRun;
    }
 
    public ExportDataExecutor() {
    }
 
    @Override
    public void run() {
 
        while (isRun) {
            log.debug("导出数据线程开始处理");
            try {
                doExportData();
            } catch (Throwable e) {
                log.error("处理消息异常", e);
                e.printStackTrace();
            }
            log.debug("导出数据线程处理完成");
 
        }
 
    }
 
    private void doExportData() throws Exception {
 
        ExportDataDto exportDataDto = ExportDataQueue.getData();
 
        this.userDownloadFileV1InnerServiceSMOImpl = ApplicationContextFactory.getBean("userDownloadFileV1InnerServiceSMOImpl", IUserDownloadFileV1InnerServiceSMO.class);
        this.fileUploadTemplate = ApplicationContextFactory.getBean("fileUploadTemplate", FileUploadTemplate.class);
 
        ByteArrayInputStream inputStream = null;
        ByteArrayOutputStream os = null;
        SXSSFWorkbook workbook = null;
        String fileName = "";
 
        if (exportDataDto == null) {
            return;
        }
 
        String businessAdapt = exportDataDto.getBusinessAdapt();
 
        IExportDataAdapt exportDataAdaptImpl = ApplicationContextFactory.getBean(businessAdapt, IExportDataAdapt.class);
 
        if (exportDataAdaptImpl == null) {
            return;
        }
        updateUserDownloadFile(exportDataDto, UserDownloadFileDto.STATE_DOING,"", "开始下载");
        try {
            workbook = exportDataAdaptImpl.exportData(exportDataDto);
            //保存文件路径到 文件下载表
            os = new ByteArrayOutputStream();
            workbook.write(os);
            inputStream = new ByteArrayInputStream(os.toByteArray());
 
            fileName = fileUploadTemplate.saveFile(inputStream, exportDataDto.getFileName());
 
 
            updateUserDownloadFile(exportDataDto, UserDownloadFileDto.STATE_FINISH,fileName, "下载完成");
 
        } catch (Throwable e) {
            e.printStackTrace();
            updateUserDownloadFile(exportDataDto, UserDownloadFileDto.STATE_FAIL, "","下载失败" + ExceptionUtil.getStackTrace(e));
        } finally {
            try {
                workbook.close();
            } catch (Exception e) {
 
            }
            try {
                inputStream.close();
            } catch (Exception e) {
 
            }
            try {
                os.close();
            } catch (Exception e) {
 
            }
 
        }
    }
 
    private void updateUserDownloadFile(ExportDataDto exportDataDto, String state,String url, String remark) {
        UserDownloadFilePo userDownloadFilePo = new UserDownloadFilePo();
        userDownloadFilePo.setDownloadId(exportDataDto.getDownloadId());
        userDownloadFilePo.setState(state);
        if(!StringUtil.isEmpty(url)){
            userDownloadFilePo.setTempUrl(url);
        }
        userDownloadFilePo.setRemark(remark.length() > 512 ? remark.substring(0, 512): remark);
        userDownloadFileV1InnerServiceSMOImpl.updateUserDownloadFile(userDownloadFilePo);
    }
 
    /**
     * 线程启动器
     */
    public static void startExportDataExecutor() {
        log.debug("开始初始化导出队列");
        ExecutorService executorService = Executors.newFixedThreadPool(DEFAULT_EXPORT_POOL);
        executorService.execute(new ExportDataExecutor(true));
        log.debug("初始化导出队列完成");
 
    }
}