2批量修改具体规则信息同时生成对应语音包 PostMappingupdateSpecificRegulars public ResultObject updateSpecificRegularsRequestBody MapString Object params HttpServletRequest request JSONObject jsonObject = JS
为了提升代码速度,可以考虑以下优化措施:
-
并行处理:使用并行流或线程池来并行处理具体规则列表中的每个规则。这样可以同时处理多个规则,提高处理速度。
-
异步处理:使用CompletableFuture.runAsync()方法来异步处理语音合成和数据库操作。这样可以在语音合成和数据库操作的同时进行其他操作,提高处理效率。
-
减少IO操作:避免在循环中频繁进行IO操作,比如删除文件和查询数据库。可以将删除文件和查询数据库的操作移动到循环外部,在处理完所有规则后再进行删除文件和数据库操作。
-
批量更新:使用specificRegularService.updateBatchById()方法进行批量更新,而不是逐个更新每个规则。这样可以减少数据库操作次数,提高处理速度。
-
合理使用日志:减少不必要的日志输出,只输出必要的日志信息,避免影响程序性能。
下面是优化后的代码示例:
@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);
}
}
``
原文地址: https://www.cveoy.top/t/topic/iKN6 著作权归作者所有。请勿转载和采集!