diff --git a/ai-analytic-center-api/pom.xml b/ai-analytic-center-api/pom.xml index 6ac34ab..26e1e34 100644 --- a/ai-analytic-center-api/pom.xml +++ b/ai-analytic-center-api/pom.xml @@ -19,7 +19,10 @@ org.springframework.cloud spring-cloud-starter-openfeign - + + org.springframework.retry + spring-retry + com.alibaba.cloud diff --git a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java index 93a01cb..0237c6d 100644 --- a/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java +++ b/ai-analytic-center-api/src/main/java/com/volvo/ai/analytic/center/feign/DiFyFeign.java @@ -3,6 +3,8 @@ package com.volvo.ai.analytic.center.feign; import com.alibaba.fastjson.JSONObject; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -16,6 +18,12 @@ public interface DiFyFeign { , produces = MediaType.APPLICATION_JSON_VALUE) JSONObject runWorkflows(@RequestHeader(value = "Authorization") String authorization, @RequestBody Map map); + @Retryable(include = Exception.class,maxAttempts = 2, backoff = @Backoff(delay = 1000)) + @PostMapping(value = "v1/workflows/run" + , consumes = MediaType.APPLICATION_JSON_VALUE + , produces = MediaType.APPLICATION_JSON_VALUE) + JSONObject runWorkflowsRetry(@RequestHeader(value = "Authorization") String authorization, @RequestBody Map map); + @PostMapping(value = "/v1/files/upload" , consumes = MediaType.MULTIPART_FORM_DATA_VALUE) diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/AiAnalyticCenterServiceApplication.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/AiAnalyticCenterServiceApplication.java index 450aec1..7eddcf7 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/AiAnalyticCenterServiceApplication.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/AiAnalyticCenterServiceApplication.java @@ -6,6 +6,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.Bean; +import org.springframework.retry.annotation.EnableRetry; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.client.RestTemplate; @@ -16,6 +17,7 @@ import com.volvo.common.feign.annotation.EnableVolvoFeignClients; @EnableScheduling @MapperScan({"com.volvo.ai.analytic.center.mapper"}) @EnableDiscoveryClient +@EnableRetry public class AiAnalyticCenterServiceApplication { public static void main(String[] args) { diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/DiFyService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/DiFyService.java index 3bfba4a..d1d3130 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/DiFyService.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/DiFyService.java @@ -10,6 +10,8 @@ public interface DiFyService { public Object getDiFyObject(DiFyReq diFyReq); + public Object getDiFyObjectRetry(DiFyReq diFyReq); + public JSONObject executeDifyFlow(DiFyReq diFyReq, String businessType, String businessData, String aiAnalysisRequestId); public JSONObject executeDifyFlow(DiFyReq diFyReq); diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java index 98a8333..a0c64d6 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/ClaimVerificationServiceImpl.java @@ -79,6 +79,9 @@ public class ClaimVerificationServiceImpl implements ClaimVerificationService { @Autowired private AiAnalysisErrorsMapper aiAnalysisErrorsMapper; + @Autowired + private DiFyRetryImpl diFyRetry; + @Override public void consumerMessageByMQ(String message) { // 生成ai分析请求id @@ -162,8 +165,8 @@ public class ClaimVerificationServiceImpl implements ClaimVerificationService { diFyReq.setUser(BusinessTypeEnum.CLAIM_VERIFICATION.getCode()); diFyReq.setFlowId(verificationToken); diFyReq.setInputs(parsedAudit); - //调用dify 工作流 - diFyObject = (JSONObject) diFyService.getDiFyObject(diFyReq); + //调用dify 工作流 失败重试一次 + diFyObject = diFyRetry.getDiFyRetry(diFyReq); //处理结果并推送MQ if (diFyObject == null) { log.error("售后索赔检核审计报告dify返回结果为空"); @@ -196,7 +199,7 @@ public class ClaimVerificationServiceImpl implements ClaimVerificationService { data.put("businessType", claimVerificationFileAnalysisDTO.getBusinessType()); data.put("aiAnalysisRequestId", aiAnalysisRequestId); data.put("fileType", claimVerificationFileAnalysisDTO.getFileType()); - log.info("索赔检核发送异常空MQMQ: {}", data.toString()); + log.info("索赔检核发送异常空MQ: {}", data.toString()); rocketMQTemplate.syncSend(topic, data); } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyRetryImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyRetryImpl.java new file mode 100644 index 0000000..3f5ccd0 --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyRetryImpl.java @@ -0,0 +1,27 @@ +package com.volvo.ai.analytic.center.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.volvo.ai.analytic.center.dto.req.DiFyReq; +import com.volvo.ai.analytic.center.service.DiFyService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Service; + +/** + * dify调用retry + */ +@Slf4j +@Service +public class DiFyRetryImpl { + + @Autowired + private DiFyService diFyService; + @Retryable(include = Exception.class,maxAttempts = 2, backoff = @Backoff(delay = 1000)) + public JSONObject getDiFyRetry(DiFyReq diFyReq) { + log.info("AI索赔检核调用DIFY(retry)"); + return (JSONObject) diFyService.getDiFyObjectRetry(diFyReq); + } + +} diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyServiceImpl.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyServiceImpl.java index 716c3ce..be3b78f 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyServiceImpl.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/service/impl/DiFyServiceImpl.java @@ -13,6 +13,8 @@ import com.volvo.ai.analytic.center.utils.AiAnalysisUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import java.util.HashMap; @@ -49,6 +51,24 @@ public class DiFyServiceImpl implements DiFyService{ return ""; } + @Override + @Retryable(include = Exception.class,maxAttempts = 2, backoff = @Backoff(delay = 1000)) + public Object getDiFyObjectRetry(DiFyReq diFyReq) { + Map map = new HashMap<>(); + map.put("inputs",diFyReq.getInputs()); + map.put("response_mode","blocking"); + map.put("user",diFyReq.getUser()); + log.info("请求DiFy入参-Retry:{}",JSON.toJSONString(map)); + JSONObject difyResult = diFyFeign.runWorkflowsRetry("Bearer "+diFyReq.getFlowId(),map); + log.info("请求DiFy响应结果:{}",difyResult.toJSONString()); + JSONObject data = difyResult.getJSONObject("data"); + if (data != null && "succeeded".equals(data.get("status"))){ + JSONObject outputs = data.getJSONObject("outputs"); + return outputs; + } + return ""; + } + @Override public JSONObject executeDifyFlow(DiFyReq diFyReq, String businessType, String businessData, String oldAiAnalysisRequestId) { String aiAnalysisRequestId = StringUtils.isEmpty(oldAiAnalysisRequestId)? AiAnalysisUtils.getAiAnalysisRequestId(businessType):oldAiAnalysisRequestId;