页面添加下载任务,后台开启线程异步下载,下载完成更新任务状态

本文介绍了一个用于导出特定主题文章的任务处理流程,包括接收请求参数、创建任务、导出文章内容为Excel文件并更新任务状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


@RequestMapping("addExportTaskAndExportExcel")
@ResponseBody
public MessageBean addExportTaskAndExportExcel(HttpServletRequest request) {
MessageBean messageBean = null;
String topicId = request.getParameter("topicId");
String exportType = request.getParameter("exportType");
String postStartTime = request.getParameter("postStartTime");
String postEndTime = request.getParameter("postEndTime");
String spiderStartTime = request.getParameter("spiderStartTime");
String spiderEndTime = request.getParameter("spiderEndTime");
String exportArticleContentFlag = request.getParameter("exportArticleContentFlag");
try {
TaskBean taskBean = new TaskBean();
String name = "【主题文章导出】";
taskBean.setType((short) 2); //主题文章导出
taskBean.setStatus((short) 1); //处理中
taskBean.setName(name);
taskBean.setRemark(null);
taskBean.setResult(null);

TopicArticleExportTaskBean bean = new TopicArticleExportTaskBean();
bean.setTopicId(topicId);
bean.setExportType(exportType);
bean.setPostStartTime(postStartTime);
bean.setPostEndTime(postEndTime);
bean.setSpiderStartTime(spiderStartTime);
bean.setSpiderEndTime(spiderEndTime);
bean.setExportArticleContentFlag(exportArticleContentFlag);

String contentJson = JsonUtil.toJson(bean);
log.info("===contentJson===" +contentJson + "===");

taskBean.setContent(contentJson);

Integer result = topicSupport.addExportTask(taskBean);
if(result!=null) {
messageBean = buildMessage(MESSAGE_TYPE_SUCCESS, "成功");
} else {
messageBean = buildMessage(MESSAGE_TYPE_ERROR, "失败");
}
String path= request.getRealPath("/");

Thread t= new Thread(new ExportTask(path, bean, result));
t.setDaemon(false);
t.start();

} catch (Exception e) {
log.error("===addExportTaskAndExportExcel==="+e.getMessage(), e);
messageBean = buildMessage(MESSAGE_TYPE_ERROR, "失败");
}
return messageBean;
}

private class ExportTask implements Runnable {
private String path;
private TopicArticleExportTaskBean bean;
private Integer result;

public ExportTask(String path, TopicArticleExportTaskBean bean, Integer result){
this.path = path;
this.bean = bean;
this.result = result;
}

@Override
public void run() {
String topicId =bean.getTopicId();
log.info("===result===" + result + "===topicId===" + bean.getTopicId() + "===postStartTime===" + bean.getPostStartTime()  + "===postEndTime===" + bean.getPostEndTime()  + "===spiderStartTime===" + bean.getSpiderStartTime()  + "===spiderEndTime===" + bean.getSpiderEndTime() + "===");
List<ArticleBean> artList = topicSupport.queryTopicArticleExportList(bean.getTopicId(),bean.getPostStartTime(), bean.getPostEndTime(), bean.getSpiderStartTime(), bean.getSpiderEndTime());

try {
if(bean.getExportArticleContentFlag()!=null && "1".equals(bean.getExportArticleContentFlag())){
if(CollectionUtils.isNotEmpty(artList)){
for(ArticleBean articleBean : artList){
String content = articleService.findArticle(articleBean.getGuid()).getContent();
content = (null == content?"":content);
articleBean.setContent(content);
}
}
}
} catch (ArticleServiceException e1) {
log.error(e1.getMessage(), e1);
}

Map<String,Object> beans = new HashMap<String,Object>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
beans.put("dateFormat", dateFormat);
beans.put("resultList", artList);
beans.put("tag", SpringContextUtil.getBean(TagUtil.class));
beans.put("constUtil", SpringContextUtil.getBean(ConstUtil.class));
XLSTransformer transformer = new XLSTransformer();
transformer.markAsFixedSizeCollection("resultList");

String templateFile = path+"//WEB-INF/classes/template/topicArticleReportTemplate.xls";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");  
String dateTime = sdf.format(new Date()) ;
String fileName = topicId + "_" + dateTime + ".xls";


String tagerPath = topicArticleExportFilePath + topicId + "/";
File targetFile = new File(tagerPath);
if(!targetFile.exists()){
targetFile.mkdirs();
targetFile = null;
}

String reportFile = topicArticleExportFilePath  +topicId + "/" + fileName;

TaskBean updateTaskBean = new TaskBean();
updateTaskBean.setId(result);
updateTaskBean.setUpdateTime(new Date());
try {
transformer.transformXLS(templateFile, beans, reportFile);
updateTaskBean.setStatus((short)2); //成功
updateTaskBean.setResult(fileName);
Integer updResult = topicSupport.updateExportTask(updateTaskBean);
log.info("===id==="+updateTaskBean.getId() + "===status==="+updateTaskBean.getStatus() + "===fileName==="+updateTaskBean.getResult() + "===updResult==="+updResult);

} catch (ParsePropertyException e) {
log.error("===addExportTaskAndExportExcel===ParsePropertyException==="+e.getMessage(), e);
updateTaskBean.setStatus((short)3); //失败
updateTaskBean.setResult("ParsePropertyException:"+e.getMessage());
try {
topicSupport.updateExportTask(updateTaskBean);
} catch (TaskServiceException e1) {
e1.printStackTrace();
}
} catch (InvalidFormatException e) {
log.error("===addExportTaskAndExportExcel===InvalidFormatException==="+e.getMessage(), e);
updateTaskBean.setStatus((short)3); //失败
updateTaskBean.setResult("InvalidFormatException:"+e.getMessage());
try {
topicSupport.updateExportTask(updateTaskBean);
} catch (TaskServiceException e1) {
e1.printStackTrace();
}

} catch (IOException e) {
log.error("===addExportTaskAndExportExcel===IOException==="+e.getMessage(), e);
updateTaskBean.setStatus((short)3); //失败
updateTaskBean.setResult("IOException:"+e.getMessage());
try {
topicSupport.updateExportTask(updateTaskBean);
} catch (TaskServiceException e1) {
e1.printStackTrace();
}
} catch (TaskServiceException e) {
log.error("===updateExportTask===TaskServiceException==="+e.getMessage(), e);
}
}
}

<think>首先,用户的问题是关于在百度地图中使用mapvgl.View时出现延迟和卡顿的优化方法。用户提到在大屏展示中添加这个图层后页面变得卡顿。 我需要回顾系统级指令: - 所有行内数学表达式必须用$...$格式。 - 独立公式用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 用户提供了两个引用: - 引用[^1]:关于性能优化,包括Profiler、IdleHandler、AsyncLayoutInflater等。 - 引用[^2]:关于图层管理组件,使用OpenLayers和ElementUI。 用户的实际问题是关于百度地图的mapvgl.View优化,所以我应该专注于这个主题。 我的回答需要: - 结构清晰,逐步解决问题。 - 保证回答真实可靠。 - 在末尾生成相关问题。 关键点: - mapvgl是百度地图的一个库,用于3D可视化。 - 添加图层后卡顿,可能由于性能问题,如渲染开销、数据处理等。 可能的优化方法: 1. **减少数据量**:优化图层数据,减少不必要的点或简化几何。 2. **使用硬件加速**:确保浏览器支持WebGL等。 3. **分批加载**:不要一次性加载所有数据,使用分页或懒加载。 4. **优化渲染设置**:调整mapvgl.View的参数,如降低质量或减少更新频率。 5. **异步处理**:使用requestAnimationFrame或Web Workers来处理计算。 6. **调试工具**:使用浏览器开发者工具(如Chrome DevTools)分析性能瓶颈。 从引用[^1]中,我可以借鉴: - 使用Profiler进行性能分析。 - 利用IdleHandler(在Web中类似requestIdleCallback)在空闲时执行任务。 - 异步加载UI元素。 从引用[^2]中,关于图层管理: - 管理多个图层的显示/隐藏,避免同时渲染所有图层。 - 实现图层控制组件,以按需加载。 构建回答结构: 1. **理解问题**:解释可能的原因。 2. **优化建议**:列出具体方法。 3. **代码示例**:提供优化代码片段。 4. **相关问题**:在末尾生成。 使用中文回答。 生成相关问题: - 例如:如何进一步优化mapvgl的性能? - 其他相关主题如地图优化技巧。 最终回答框架: - 引言:确认问题。 - 步骤1:诊断性能瓶颈。 - 步骤2:优化数据。 - 步骤3:优化渲染。 - 步骤4:使用异步技术。 - 代码示例。 - 相关问题。</think>### 百度地图添加mapvgl.View图层后页面延迟卡顿的优化方法 在百度地图中使用`mapvgl.View`添加3D可视化图层时,页面出现延迟和卡顿是常见问题,主要源于渲染开销过大、数据量过多或主线程阻塞。以下基于性能优化原则,提供逐步解决方案。优化核心是减少渲染负载、异步处理数据和利用空闲资源[^1]。 #### 步骤1: 诊断性能瓶颈 在优化前,先用浏览器开发者工具(如Chrome DevTools)分析性能瓶颈: - 打开**Performance**面板,录制页面操作。 - 检查**Main**线程的卡顿点:`mapvgl.View`的渲染通常占用高CPU或GPU资源。 - 查看**Memory**标签:数据量过大会导致内存泄漏或频繁GC(垃圾回收)。 诊断后,针对性地优化。 #### 步骤2: 优化图层数据量 减少渲染数据是根本方法: - **简化几何数据**:使用算法(如Douglas-Peucker)简化点、线、面,降低顶点数。例如,将数据点减少到合理范围(如1000个以内)。 - **数据分片加载**:不要一次性加载所有数据。改用分批加载或按视口动态加载。 ```javascript // 示例:按地图视口动态加载数据 map.addEventListener('moveend', function() { const bounds = map.getBounds(); const visibleData = rawData.filter(point => bounds.containsPoint(point)); layer.setData(visibleData); // 仅更新可视区域数据 }); ``` - **数据压缩**:使用二进制格式(如GeoJSON简化版)替代JSON,减少解析时间。 #### 步骤3: 优化渲染设置 调整`mapvgl.View`参数以降低渲染开销: - **降低渲染质量**:在`View`初始化时设置较低的分辨率或关闭抗锯齿。 ```javascript const view = new mapvgl.View({ map: map, resolution: 0.5, // 降低分辨率,减少GPU负载 antialias: false // 关闭抗锯齿 }); ``` - **控制图层更新频率**:避免频繁重绘。使用防抖(debounce)限制更新次数。 ```javascript let updateTimer; function updateLayer() { clearTimeout(updateTimer); updateTimer = setTimeout(() => { layer.setData(newData); }, 100); // 每100ms最多更新一次 } ``` - **图层管理**:参考图层管理组件设计[^2],实现按需显示/隐藏图层。例如,添加UI控件控制图层激活状态,避免同时渲染所有图层。 ```javascript // 示例:图层切换逻辑 document.getElementById('toggle-layer').addEventListener('click', function() { layer.setVisible(!layer.getVisible()); // 按需显示/隐藏 }); ``` #### 步骤4: 使用异步和空闲资源处理 避免主线程阻塞,借鉴异步优化技术[^1]: - **异步数据加载**:用Web Workers在后台线程处理数据计算,减轻主线程负担。 ```javascript // 示例:使用Web Worker解析数据 const worker = new Worker('data-worker.js'); worker.postMessage(rawData); worker.onmessage = (event) => { layer.setData(event.data); // 主线程更新渲染 }; ``` 在`data-worker.js`中处理复杂计算(如数据简化)。 - **空闲时渲染**:利用`requestIdleCallback`在浏览器空闲时执行非关键任务(类似IdleHandler原理[^1])。 ```javascript function idleUpdate() { requestIdleCallback((deadline) => { if (deadline.timeRemaining() > 0) { updateLayer(); // 仅在空闲时更新图层 } }); } map.addEventListener('zoomend', idleUpdate); ``` - **硬件加速**:确保CSS开启GPU加速(如`transform: translateZ(0)`),并检查浏览器支持WebGL。 #### 其他建议 - **监控内存泄漏**:定期销毁未使用的图层对象(`layer.destroy()`),避免内存累积。 - **降级方案**:对于低端设备,提供2D回退模式(如用`mapvgl`的2D图层替代)。 - **工具辅助**:结合百度地图API的调试工具和第三方库(如`stats.js`)实时监控帧率。 通过以上方法,通常能显著减少卡顿。如果问题持续,建议使用Profiler工具深入分析[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值