From 9be1a1e30728b39fce17b3a8c738894ba39882a3 Mon Sep 17 00:00:00 2001 From: litianxiang Date: Tue, 24 Mar 2026 15:49:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E9=94=81=E8=A7=A3=E5=86=B3=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=BA=BF=E7=A8=8B=E8=AF=BB=E5=8F=96=E5=89=8D=E8=BF=98?= =?UTF-8?q?=E6=9C=AA=E4=BF=9D=E5=AD=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/service/impl/GenerateServiceImpl.java | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 4cef593a..87bc3a48 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -219,6 +219,8 @@ public class GenerateServiceImpl extends ServiceImpl i version = "fast"; params.put("version", "fast"); } + // 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中 + saveGenerateImmediately(generate); // 3.1 确定不同类型的印花分别调哪个接口 if (generateThroughImageTextDTO.getLevel1Type().equals(PRINT_BOARD.getRealName())) { switch (generateThroughImageTextDTO.getLevel2Type()) { @@ -258,8 +260,6 @@ public class GenerateServiceImpl extends ServiceImpl i .prompt(text).build(); jsonString = JSON.toJSONString(imageProcessRequest); } - // 4、将请求信息落库,将本次generate的请求信息添加到t_generate表中 - saveGenerateImmediately(generate); Boolean requestResult = pythonService.generateSketchOrPrint(jsonString, port, path,generateThroughImageTextDTO.getUniqueId()); @@ -276,9 +276,31 @@ public class GenerateServiceImpl extends ServiceImpl i redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); } - @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) public void saveGenerateImmediately(Generate generate) { save(generate); + // 写入完成后设锁,通知 MQ 消费者可以安全读取 + String lockKey = "generate:lock:" + generate.getUniqueId(); + redisUtil.addToString(lockKey, "1", 60L); + } + + private void waitForSaveLock(String uniqueId) { + String lockKey = "generate:lock:" + uniqueId; + int maxRetries = 30; + int retryIntervalMs = 200; + for (int i = 0; i < maxRetries; i++) { + if (Boolean.TRUE.equals(redisUtil.hasKey(lockKey))) { + log.debug("Save lock acquired for uniqueId: {} after {} retries", uniqueId, i); + return; + } + try { + Thread.sleep(retryIntervalMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.warn("Interrupted while waiting for save lock: {}", uniqueId); + return; + } + } + log.warn("Save lock timeout for uniqueId: {}, proceeding anyway", uniqueId); } public GenerateModeEnum getMode(GenerateThroughImageTextDTO generateThroughImageTextDTO) { @@ -307,6 +329,8 @@ public class GenerateServiceImpl extends ServiceImpl i GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); Generate generate; try { + // 等待 HTTP 线程写入完成后再查库 + waitForSaveLock(taskId); generate = selectByUniqueId(taskId); } catch (MybatisPlusException e) { log.error(e.getMessage());