是否存在临界区,共享的变量,会被不同线程写入
(相关资料图)
那么模板方法里面基类的成员变量或者方法就会存在线程安全问题
2、excelAbstractExcelSheet业务数据和excel 逻辑 解耦
让data 可以 在service 层之间set进来
这样excel的相关类不用添加到 spring 容器中
public abstract class AbstractExcelSheetBusiPackageResultExcelSheet{ private XSSFWorkbook workbook; private XSSFSheet sheet; /** * 写入数据 */ private List data; public void setData(List data) { this.data = data; } /** * 获取当前类的sheet对象 * * @return sheet对象 */ public XSSFSheet getSheet() { return sheet; } /** * 设置sheet对象 * * @param sheet sheet对象 */ public void setSheet(XSSFSheet sheet) { this.sheet = sheet; } /** * 获取所属的excel对象 * * @return excel对象 */ public XSSFWorkbook getWorkbook() { return workbook; } /** * 设置excel对象 * * @param workbook excel对象 */ public void setWorkbook(XSSFWorkbook workbook) { this.workbook = workbook; } /** * 创建sheet页基本信息 */ public abstract void createSheet(); /** * 在子类重写 * * @return 标题列 */ public abstract List getTitles(); /** * 生成sheet标题列,此方法不必重写 */ public void createTitleRow() { List titles = getTitles(); // 得到行 XSSFRow titleRow = getSheet().createRow(0); for (int i = 0; i < titles.size(); i++) { XSSFCell cell = titleRow.createCell(i); cell.setCellStyle(ExportExcelUtil.getTitleStyle(getWorkbook())); cell.setCellValue(titles.get(i)); } // 设置行高 titleRow.setHeight((short) 460); } /** * 添加导出excel的内容 * * @param data 导出数据 */ public abstract void createDataRow(List data); /** * writeSheetData */ public void writeSheetData() { // 创建表单 sheet createSheet(); // sheet 设置表头内容(第一行内容) createTitleRow(); // 从数据库取数并写到文件中 createDataRow(data); } /** * 写入一行 sheet 数据 * * @param rowIndex sheet 写入 行索引 * @param data sheet 实体数据 * @param enumValues sheet 表头标题 * @param 泛型 */ protectedvoid writeRowData(int rowIndex, S data, SheetTitleEnum[] enumValues) { XSSFRow row = getSheet().createRow(rowIndex); int colIndex = 0; XSSFCell cell = row.createCell(colIndex); for (SheetTitleEnum enumValue : enumValues) { String cellValue = ExportExcelUtil.getCellValue(data, enumValue); cell.setCellValue(cellValue); cell = row.createCell(++colIndex); } }}
业务知识包检查结果.xlsx 业务知识包检查结果 sheet
public class BusiPackageResultExcelSheetBusiPkgRuleResultExcelSheetextends AbstractExcelSheet { private final static String SHEET_NAME = "业务知识包检查结果"; @Override public void createSheet() { this.setSheet(this.getWorkbook().createSheet(SHEET_NAME)); } @Override public List getTitles() { return BusiPackageResultSheetTitleEnum.titles; } @Override public void createDataRow(List data) { // 表头 rowIndex = 0, 所以 rowIndex = 1 int rowIndex = 1; SheetTitleEnum[] enumValues = BusiPackageResultSheetTitleEnum.values(); for (T dataEntry : data) { // 写入行数据 writeRowData(rowIndex++, dataEntry, enumValues); } }}
业务知识包检查结果.xlsx 规则检查结果 sheet
public class BusiPkgRuleResultExcelSheetRuleResultExcelSheetextends RuleResultExcelSheet { @Override public void createDataRow(List data) { // 表头 rowIndex = 0, 所以 rowIndex = 1 int rowIndex = 1; for (T dataEntry : data) { // 写入行数据 writeRowData(rowIndex++, dataEntry, RuleResultSheetTitleEnum.values()); } }}
规则检查结果.xlsx 规则检查结果 sheet
public class RuleResultExcelSheetextends AbstractExcelSheet { private final static String SHEET_NAME = "规则检查结果"; @Override public void createSheet() { this.setSheet(this.getWorkbook().createSheet(SHEET_NAME)); } /** * 表头内容 * * @return 表头内容 */ @Override public List getTitles() { return RuleResultSheetTitleEnum.titles; } @Override public void createDataRow(List data) { // 表头 rowIndex = 0, 所以 rowIndex = 1 int rowIndex = 1; SheetTitleEnum[] enumValues = RuleResultSheetTitleEnum.values(); for (T dataEntry : data) { // 写入行数据 writeRowData(rowIndex++, dataEntry, enumValues); } }}
上面的设计 大部分的方法都是在基类实现了
当excel的表头不一样,是在子类实现的
3、线程安全问题点所有的成员变量都有可能被其他线程争抢,
比如 线程1 setData data1
但是此时如果线程1 excel 还没导出成功,
线程2进来了 setData data2
把线程1的 data 覆盖了
其实还有很多线程问题,因为多线程是不可控的
4、解决service 在的调用 excel 实现类的时候,变成局部变量
在单应用中 合理运用 synchronized 、ReentrantLock、ThreadLocal 原子应用
分布式 合理运用 redis 锁
两种运用,注意死锁问题
上一篇:ETF午评|证券领涨,证券ETF先锋上涨2.17%-今日热讯
下一篇:最后一页
X 关闭
X 关闭
中新网上海3月30日电 (记者 陈静)上海正面临常态化防控以来疫情形势最严峻复杂的挑战,单日新增阳性感染者数量不断刷新纪录。记者30
中新网3月30日电 据国家地震台网官方微博消息,中国地震台网正式测定:3月30日18时14分在新疆和田地区皮山县(北纬36 01度,东经77 89
上海市委常委会今天上午(3月30日)举行会议,听取当前疫情应急处置和核酸筛查相关工作汇报,研究部署下一步疫情防控重点工作。市委书记
(抗击新冠肺炎)江苏无锡一男子隐匿行程轨迹被警方立案侦查 中新网无锡3月30日电 (记者 孙权)3月30日,无锡市在“应检尽检”人员核
(抗击新冠肺炎)官方称吉林市疫情扩散势头得到遏制 中新网吉林3月30日电 (记者 石洪宇)记者30日从吉林市政府新闻办召开的疫情防控
中新网唐山3月30日电 (白云水 孟潮)3月30日,河北省唐山市召开新冠肺炎疫情防控工作新闻发布会通报称,3月29日0时至24时,唐山市新增
浙江省嘉兴市秀洲区新型冠状病毒感染肺炎疫情防控指挥部办公室发布通告: 3月30日上午,秀洲区发现1例新冠肺炎阳性感染者,该感染者
今天(3月30日)下午,新疆乌鲁木齐市人民政府新闻办公室召开疫情防控新闻发布会,通报乌鲁木齐市新冠肺炎疫情和疫情防控最新情况。会上
中新网天津3月30日电 (记者 王君妍)记者30日从天津市水务局获悉,为充分发挥河湖长制优势,近日,天津市将南水北调中线天津干线(天津
(抗击新冠肺炎)河北廊坊累计治愈出院673例 5县区恢复域内交通 中新网廊坊3月30日电 (宋敏涛 郭京泉)30日,河北省廊坊市召