网站 内容 营销网站建设骗子公司

news/2025/9/23 11:36:21/文章来源:
网站 内容 营销,网站建设骗子公司,怎么关闭网站安全检测,广告设计一般用什么软件7.9 额外实现 7.9.1 任务补偿机制 问题#xff1a;如果有线程抢占了某个视频的处理任务#xff0c;如果线程处理过程中挂掉了#xff0c;该视频的状态将会一直是处理中#xff0c;其它线程将无法处理#xff0c;这个问题需要用补偿机制。 单独启动一个任务找到待处理任…7.9 额外实现 7.9.1 任务补偿机制 问题如果有线程抢占了某个视频的处理任务如果线程处理过程中挂掉了该视频的状态将会一直是处理中其它线程将无法处理这个问题需要用补偿机制。 单独启动一个任务找到待处理任务表中超过执行期限但仍在处理中的任务将任务的状态改为执行失败。 任务执行期限是处理一个视频的最大时间比如定为30分钟通过任务的启动时间去判断任务是否超过执行期限。 大家思考这个sql该如何实现 大家尝试自己实现此任务补偿机制。 数据库表结构 表media_process: 根据status字段判断视频文件是否正在处理如果status值为4正在处理且当前时间减去create_date超过30分钟就把status的值修改为3处理失败并更新其他字段的值。 具体实现流程 编写检查超时的sql SELECT * FROM media_process_history WHERE TIMESTAMPDIFF(MINUTE,create_date,finish_date) 30在media_process的mapper接口中添加相应的接口 MediaProcessMapper.java /*** 查询是否有执行超过30分钟的视频处理任务* param nowDate 当前任务执行的时间* return ListMediaProcess*/ Select(SELECT * FROM media_process_history WHERE TIMESTAMPDIFF(MINUTE,create_date,#{date}) 30) ListMediaProcess selectTimeoutProcess(Param(date)Date nowDate);实现service代码 /*** 超时任务列表* param shardIndex 分片序号* param shardTotal 分片总数* param count 获取记录数cpu核心数* return ListMediaProcess*/ Override public ListMediaProcess getTimeoutMediaProcessList(int shardIndex, int shardTotal, int count) {ListMediaProcess mediaTimeoutProcessList mediaProcessMapper.selectTimeoutProcess(LocalDateTime.now(), shardIndex, shardTotal, count);return mediaTimeoutProcessList; }业务逻辑在task中实现 查询相应超时记录把status和errMsg字段更新后保存到media_process表里。 /*** 处理视频超时任务* throws Exception*/ XxlJob(videoTimeoutJobHandler) public void videoTimeoutJobHandler() throws Exception {// 分片参数int shardIndex XxlJobHelper.getShardIndex();int shardTotal XxlJobHelper.getShardTotal();ListMediaProcess mediaTimeoutProcessList null;int size 0;try {// 取出cpu核心数作为一次检查超时的记录条数int availableProcessors Runtime.getRuntime().availableProcessors();mediaTimeoutProcessList mediaFileProcessService.getTimeoutMediaProcessList(LocalDateTime.now(), shardIndex, shardTotal, availableProcessors);size mediaTimeoutProcessList.size();log.debug(取出的超时任务数量是 {} 条, size);if (size 0) {return ;}} catch (Exception e) {log.error(取出的超时任务超时, size);e.printStackTrace();}// 启动size个线程的线程池ExecutorService fixedThreadPool Executors.newFixedThreadPool(size);// 定义size个插销CountDownLatch countDownLatch new CountDownLatch(size);mediaTimeoutProcessList.forEach(mediaProcess - {// 将任务加入线程池fixedThreadPool.execute(() - {try {// 把status值设置为3并把errMsg更新Long taskId mediaProcess.getId();String fileId mediaProcess.getFileId();mediaFileProcessService.saveProcessFinishStatus(taskId, 3, fileId, null, 处理视频超时30分钟);log.debug(删除超时任务);} catch (Exception e) {e.printStackTrace();log.error(删除超时任务失败失败原因: {}, e.getMessage());} finally {countDownLatch.countDown();}});});// 等待给一个充裕的超时事件防止无限等待到达超时时间还没有处理完成则结束任务countDownLatch.await(30, TimeUnit.MINUTES); }7.9.2 达到最大失败次数暂时未实现 问题需要找到前端对应的接口。 当任务达到最大失败次数时一般就说明程序处理此视频存在问题这种情况就需要人工处理在页面上会提示失败的信息人工可手动执行该视频进行处理或通过其它转码工具进行视频转码转码后直接上传mp4视频。 7.9.3 分块文件清理问题 上传一个文件进行分块上传上传一半不传了之前上传到minio的分块文件要清理吗怎么做的 1、在数据库中有一张文件表记录minio中存储的文件信息。 2、文件开始上传时会写入文件表状态为上传中上传完成会更新状态为上传完成。实现过程中并没有往文件表中插入正在上传的文件记录只是在media_minio_files临时保存了分块信息 3、当一个文件传了一半不再上传了说明该文件没有上传完成会有定时任务去查询文件表中的记录如果文件未上传完成则删除minio中没有上传成功的文件目录。 实现思路 难点怎么判断文件上传了一半不再上传了上传分块文件只在上传视频时有用上传分块文件时不会往media_files表里添加记录只有所有分块上传完成并合并成功后才会往media_files里插入数据。所以要建立一个media_minio_files表每上传一个分块就往media_minio_files表里插入一条分块信息记录包括分块的上传时间。如果超过30分钟分块记录还没有被删除说明上传到一半不传了把minio里的分块目录删除并删除对应的数据库里的记录。在文件合并成功后数据库里的分块文件上传记录也要删除。 media_minio_files表结构 具体实现流程 上传文件块的时候上传一个文件块完毕要把这个块的信息保存到表里。 /*** 把文件分块信息入库* param fileMd5 文件md5* param fileName 文件名称* param bucket minio桶* param objectName minio中块的存储路径* param chunkSize 块大小* return MediaMinioFiles*/ Transactional Override public MediaMinioFiles addMediaChunkToDb(String fileMd5, String fileName, String bucket, String objectName, Long chunkSize) {MediaMinioFiles mediaMinioFile new MediaMinioFiles();mediaMinioFile.setFileId(fileMd5);mediaMinioFile.setFilename(fileName);mediaMinioFile.setBucket(bucket);mediaMinioFile.setFilePath(objectName);mediaMinioFile.setFileSize(chunkSize);mediaMinioFile.setStatus(4); // 上传中int insert mediaMinioFilesMapper.insert(mediaMinioFile);if (insert 0) {log.error(保存分块文件信息到数据库失败{}, mediaMinioFile.toString());XueChengPlusException.cast(保存分块文件信息失败);}log.debug(保存分块文件信息到数据库成功{}, mediaMinioFile.toString());return mediaMinioFile; }/*** 上传分块* param fileMd5 文件md5* param chunk 分块序号* param localChunkFilePath 分块文件本地路径* return RestResponse*/ Override public RestResponse uploadChunk(String fileMd5, int chunk, String localChunkFilePath) {// 得到分块文件的目录路径String chunkFileFolderPath getChunkFileFolderPath(fileMd5);// 得到分块文件的路径String chunkFilePath chunkFileFolderPath chunk;// mimeTypeString mimeType getMimeType(null);// 将文件存储到 minioboolean b addMediaFilesToMinIO(localChunkFilePath, mimeType, bucketVideoFiles, chunkFilePath);// 将分块信息存到数据库中currentProxy.addMediaChunkToDb(fileMd5, null, bucketVideoFiles, chunkFilePath, 1024 * 5L);if (!b) {log.debug(上传分块文件失败: {}, chunkFilePath);return RestResponse.validfail(false, 上传分块失败);}log.debug(上传分块文件成功: {}, chunkFilePath);return RestResponse.success(true); }如果没有上传失败在成功合并块文件之后要把上面数据库中记录删除。 /*** 删除数据库中的分块文件上传记录* param fileMd5 文件md5*/ Transactional public void clearChunkFromDb(String fileMd5) {LambdaQueryWrapperMediaMinioFiles deleteQueryWrapper new LambdaQueryWrapper();deleteQueryWrapper.eq(MediaMinioFiles::getFileId, fileMd5);try {mediaMinioFilesMapper.delete(deleteQueryWrapper);log.debug(删除分块上传记录成功);} catch (Exception e) {e.printStackTrace();log.error(删除分块上传记录失败);} }在合并分块的最后几行 // 文件入库 currentProxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucketVideoFiles, mergeFilePath); // 清除文件分块 clearChunkFiles(chunkFileFolderPath, chunkTotal); // 清除数据库中文件分块上传信息 currentProxy.clearChunkFromDb(fileMd5); return RestResponse.success(true);如果上传文件一半失败要根据数据库中media_minio_files表中存的块的路径删除所有超时块。 首先查询所有的超时块得到上传的超时块列表 /*** 拿到数据库中所有上传超时的文件分块信息* param time 当前任务执行时间* return ListMediaMinioFiles*/ Override public ListMediaMinioFiles getChunkTimeoutFiles(LocalDateTime time) {ListMediaMinioFiles mediaMinioFiles mediaMinioFilesMapper.selectTimeoutChunks(DateUtil.toDateTime(time));return mediaMinioFiles; }删除minio中所有超时块并且删除所有超时记录 XxlJob(videoChunkTimeoutJobHandler) public void videoChunkTimeoutJobHandler() {log.debug( 开始执行检查上传超时块任务);// 拿到所有的超时分块任务ListMediaMinioFiles chunkTimeoutFiles mediaFileService.getChunkTimeoutFiles(LocalDateTime.now());if (chunkTimeoutFiles null) { // 没有超时任务log.debug(没有超时任务);return ;}// 根据记录中的file_path删除minio中的所有文件chunkTimeoutFiles.forEach(chunk - {String filePath chunk.getFilePath();mediaFileService.clearSingleChunkFile(filePath);});// 删除数据库中对应的记录mediaFileService.clearChunkFromDb(null, LocalDateTime.now()); }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么制作网站教程视频广州定制网站开发

JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据。说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象。要添加System.Web.Extensions.dll的引用。该类位于System.Web.Script.Serialization命…

上海h5网站建设脑洞大开的创意设计

本项目以Springboot 2.7.11和vue2做参考示例 第一步 展示前后端代码的成品 前端Vue 后端Java 项目写完后,差不多就是这个样子,仅供参考! 第二步 开始打包前后端项目 前端打包的方式有以下几种: 方法1: #直接打包&#xff0…

汽贸公司网站建设抖音代运营介绍

HTTP协议定义了多种请求方法,用于不同的操作。最常见的有 GET、POST 和 PUT。 GET:GET 是最常用的方法,通常用于请求服务器发送某个资源。GET 请求只通过 URL 传送数据,数据信息会附在 URL 之后,以参数的形式附加。由于这种传送方式的限制,GET 请求的数据量较小,且安全性…

工会网站建设请示一级消防工程师考试试题及答案

1、认识Block Block封装了一段代码,可以在任何时候执行Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值,它和传统的函数指针很类似,但是有区别:block是inline(内联函数)的&#x…

Gitee:本土化代码托管平台如何重塑中国开发者协作生态

Gitee:本土化代码托管平台如何重塑中国开发者协作生态 在全球化与数字化双重浪潮的冲击下,软件开发行业正经历着前所未有的变革。作为这一变革的核心基础设施,代码托管平台的重要性愈发凸显。在这一领域中,Gitee凭…

详细介绍:麒麟v10服务器安装libvirt

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

WEB项目引入druid监控配置

1、web.xml<!-- 添加Web应用等监控--><filter><filter-name>DruidWebStatFilter</filter-name><filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class><…

Computer Graphics Tutorial

https://www.tutorialspoint.com/computer_graphics/index.htm

网站设计电脑培训学校wordpress导航菜单下拉

原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 CPU&#xff0c;允许它并行执行多个指令。操作系统通过将进程调度到不同的内核来发挥这个结构的优点。然而&#xff0c;还可以通过异步 I/O 操作…

CF1874(CF Round 901) 总结

CF1874(CF Round 901) 总结 A 显然若干轮之后,每两次操作不会改变它们的苹果,于是让 \(K\) 对一个较小数取 \(\min\) 然后暴力做即可。 B 每一位是独立的,对于 \(a,b,m\) 都相同的位,操作后的结果一定相同,所以只…

南通网站建设南通怎么修改网站后台权限

服务器安装IIS&#xff1a; 微软官网下载SDK&#xff1a; 下载Runtime官网&#xff1a;https://dotnet.microsoft.com/download/dotnet-core 安装成功重启IIS&#xff1a; VS发布项目&#xff1a;

ps个人网站建设英文网站建设的问题

随着ChatGPT引领的AI破圈&#xff0c;各行各业掀起了AI落地的潮流&#xff0c;从智能客服、智能写作、智能监控&#xff0c;到智能医疗、智能家居、智能金融、智能农业&#xff0c;谁能快速将AI与传统业务相结合&#xff0c;谁就将成为企业数字化和智能化变革的优胜者。然而&am…

国内购物网站哪个最好网络广告策划方案怎么做

前两天有一个学html5前端小美女问我一个有关文字阴影的效果怎么去实现。她和我说文字阴影嘛,她也知道text-shadow,.但是却做不出想要的样子,其实css3的新功能是很强大的,不要把你的思想太过于局限化,好了,闲话也不多说,咱们就先来看看这个文本阴影. 一.文字阴影text-shadow 文…

wordpress知更鸟more排名好的网站关键词优化企业

Dataload介绍 DataLoad是一个针对Oracle开发的数据录入工具(也适用其他程序),其工作原理是模仿键盘的操作,将数据和键盘的按键以表格的形式存储起来。当你需要在目标程序界面中输入数据的时候,dataload根据所定义的数据和键盘按键顺序,将数据录入。 Dataload常用命令 Da…

好网站的特点网站模板制作与安装教程

2023-12-03每日一题 一、题目编号 1423. 可获得的最大点数二、题目链接 点击跳转到题目位置 三、题目描述 几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#x…

网站开发流程表微网站建设公司

2020 MATLAB EXPO 中国线上用户大会一切转型始于数据和模型2020 年 7 月 21-24 日 | 线上直播MATLAB 和 Simulink&#xff0c;作为业界普遍使用的科学计算与模型仿真软件&#xff0c;已被全球的工程师和科学家们广泛应用于加快汽车、航空、电子、金融服务、生物医药以及其他行业…

长沙手机网站设计郴州旅游

楔子四年前我虽然也写了很多年代码&#xff0c;由于公司虽然规模不小&#xff0c;却并非一家规范化的软件公司&#xff0c;因此在项目中严格意义上来说并没有架构设计、也不写单元测试&#xff0c;后来有幸加入了一家公司&#xff0c;这家公司虽然也是一家小公司&#xff0c;但…

9.23 资料分析 7/10

9.23 资料分析 7/101.转换问题 转换为混合增长率技巧 思路问题

2. Spring AI 快速入门使用 - Rainbow

2. Spring AI 快速入门使用 @目录2. Spring AI 快速入门使用快速使用接入deepseek流式对话options配置选项temperature(温度)建议maxTokens stop模型推理原理:接入阿里百炼使用文生图文生语音text2audio语音翻译aud…

PyCharm 2025.1安装包下载与安装教程

软件介绍 PyCharm 2025.1 是 JetBrains 推出的革命性 Python 集成开发环境,采用统一版本架构整合了专业版与社区版功能。核心功能如 Jupyter Notebook 支持、基础代码编辑、调试器及版本控制完全免费开放,同时推出 P…