为了提升代码速度,可以考虑以下优化措施:

  1. 并行处理:使用并行流或线程池来并行处理具体规则列表中的每个规则。这样可以同时处理多个规则,提高处理速度。

  2. 异步处理:使用CompletableFuture.runAsync()方法来异步处理语音合成和数据库操作。这样可以在语音合成和数据库操作的同时进行其他操作,提高处理效率。

  3. 减少IO操作:避免在循环中频繁进行IO操作,比如删除文件和查询数据库。可以将删除文件和查询数据库的操作移动到循环外部,在处理完所有规则后再进行删除文件和数据库操作。

  4. 批量更新:使用specificRegularService.updateBatchById()方法进行批量更新,而不是逐个更新每个规则。这样可以减少数据库操作次数,提高处理速度。

  5. 合理使用日志:减少不必要的日志输出,只输出必要的日志信息,避免影响程序性能。

下面是优化后的代码示例:

@PostMapping("/updateSpecificRegulars")
public Result<Object> updateSpecificRegulars(@RequestBody Map<String, Object> params, HttpServletRequest request) {
    JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(params));
    JSONArray jsonArray = jsonObject.getJSONArray("specificRegular");
    List<SpecificRegular> specificRegulars = JSONObject.parseArray(jsonArray.toJSONString(), SpecificRegular.class);
    List<SpecificRegular> specificRegularList = new ArrayList<>();

    if (CollectionUtils.isEmpty(specificRegulars)) {
        log.error("前端传回集合为空");
        return new Result<>(ResultCode.FAIL);
    }

    ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    for (SpecificRegular specificRegular : specificRegulars) {
        SpecificRegular specificRegularMy = specificRegularService.queryOneSpecificRegularByID(specificRegular.getSpecificRegularId());
        if (specificRegularMy == null) {
            log.error("通过具体规则id找到具体规则为空");
            return new Result<>(ResultCode.FAIL);
        }

        if (StringUtils.hasText(specificRegular.getVoiceBroadcastText()) && specificRegular.getDemeritState() != 0) {
            if (!specificRegular.getVoiceBroadcastText().equals(specificRegularMy.getVoiceBroadcastText()) || !specificRegular.getDemeritState().equals(specificRegularMy.getDemeritState())) {
                String audioText = specificRegular.getVoiceBroadcastText() + ",扣" + specificRegular.getDemeritState() + "分";
                Project project = projectService.queryOneProjectByID(specificRegularMy.getProjectId());
                String audioFileFirstName = project.getProjectTypeId().toString() + "-" + specificRegularMy.getProjectId().toString() + "-" + specificRegularMy.getAllPrDemeritInfoId().toString();
                String audioFileSecondName = System.currentTimeMillis() + ".wma";
                String pathName = audioPath + audioFileFirstName + "_" + audioFileSecondName;
                File folder = new File(audioPath);
                if (folder.isDirectory()) {
                    log.info("D:/new_audio/不为空!");
                    Arrays.stream(folder.listFiles())
                            .filter(file -> file.getName().contains("_"))
                            .forEach(file -> {
                                String[] fileNames = file.getName().split("_");
                                if (fileNames.length > 1 && fileNames[0].equals(audioFileFirstName)) {
                                    executorService.execute(() -> {
                                        if (file.delete()) {
                                            log.info("文件删除成功!");
                                            if (specificRegularMy.getAudioFileId() != null) {
                                                AudioFile audioFile = audioFileService.queryOneAudioFileByID(specificRegularMy.getAudioFileId());
                                                int ret = audioFileService.deleteOneAudioFileByIdAndName(specificRegularMy.getAudioFileId(), fileNames[1]);
                                                if (ret > 0) {
                                                    log.info("数据库语音数据删除成功!");
                                                    log.info("需要删除的语音包:" + audioFile.getAudioFilePath());
                                                    springToGameService.reloadDeleteAudioFile(audioFile);
                                                } else {
                                                    log.info("找不到id:" + specificRegularMy.getAudioFileId() + "文件名:" + fileNames[1] + "的数据库语音数据!");
                                                }
                                            }
                                        } else {
                                            log.error("文件删除失败!");
                                        }
                                    });
                                }
                            });
                }

                CompletableFuture.runAsync(() -> {
                    try {
                        //调用语音合成方法合成语音
                        boolean b = SpeechUtil.SpeechSynthesizer(audioText, pathName);
                        if (b) {
                            log.info("语音包合成成功!");
                        }
                    } catch (Exception e) {
                        log.error("语音包合成失败!", e);
                    }
                });

                //新增一个语音包
                AudioFile audioFile = new AudioFile();
                audioFile.setAudioFileFirstName(audioFileFirstName);
                audioFile.setAudioFileSecondName(audioFileSecondName);
                audioFile.setAudioFilePath(pathName);

                int ret = audioFileService.addOneAudioFile(audioFile);

                if (ret > 0) {
                    specificRegularMy.setJudgeState(specificRegular.getJudgeState());//评判状态
                    specificRegularMy.setSpecificJudgeParam(specificRegular.getSpecificJudgeParam());//评判参数
                    specificRegularMy.setVoiceBroadcastText(specificRegular.getVoiceBroadcastText());//语音播报文字
                    specificRegularMy.setDemeritState(specificRegular.getDemeritState());//扣分情况
                    specificRegularMy.setAudioFileId(audioFile.getAudioFileId());//语音文件id
                    specificRegularList.add(specificRegularMy);
                } else {
                    log.error("新增语音包失败!");
                    return new Result<>(ResultCode.FAIL);
                }
            } else {
                specificRegularMy.setJudgeState(specificRegular.getJudgeState());
                specificRegularMy.setSpecificJudgeParam(specificRegular.getSpecificJudgeParam());
                specificRegularList.add(specificRegularMy);
            }
        }
    }

    executorService.shutdown();

    boolean batchUpdate = specificRegularService.updateBatchById(specificRegularList);

    if (batchUpdate) {
        return new Result<>(ResultCode.SUCCESS);
    } else {
        log.error("具体规则批量修改失败!");
        return new Result<>(ResultCode.FAIL);
    }
}
``
2批量修改具体规则信息同时生成对应语音包 PostMappingupdateSpecificRegulars public ResultObject updateSpecificRegularsRequestBody MapString Object params HttpServletRequest request JSONObject jsonObject = JS

原文地址: https://www.cveoy.top/t/topic/iKN6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录