fix(pdf): 优化PDF文本提取服务异常处理

- 添加FeignException专门处理逻辑
- 实现详细的Feign异常日志记录功能
- 新增响应体解析和根因链构建方法
- 添加异常消息规范化处理
- 改进错误日志的可读性和调试信息完整度
This commit is contained in:
2026-02-06 18:52:51 +08:00
parent e862925a06
commit 329382db47

View File

@@ -4,6 +4,8 @@ import com.datamate.common.infrastructure.common.Response;
import com.datamate.datamanagement.infrastructure.client.PdfTextExtractClient; import com.datamate.datamanagement.infrastructure.client.PdfTextExtractClient;
import com.datamate.datamanagement.infrastructure.client.dto.PdfTextExtractRequest; import com.datamate.datamanagement.infrastructure.client.dto.PdfTextExtractRequest;
import com.datamate.datamanagement.infrastructure.client.dto.PdfTextExtractResponse; import com.datamate.datamanagement.infrastructure.client.dto.PdfTextExtractResponse;
import feign.FeignException;
import feign.Request;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
@@ -47,8 +49,71 @@ public class PdfTextExtractAsyncService {
} else { } else {
log.info("PdfTextExtract succeeded, datasetId={}, fileId={}", datasetId, fileId); log.info("PdfTextExtract succeeded, datasetId={}, fileId={}", datasetId, fileId);
} }
} catch (FeignException feignException) {
logFeignException(datasetId, fileId, feignException);
} catch (Exception e) { } catch (Exception e) {
log.error("PdfTextExtract call failed, datasetId={}, fileId={}", datasetId, fileId, e); log.error("PdfTextExtract call failed, datasetId={}, fileId={}", datasetId, fileId, e);
} }
} }
private void logFeignException(String datasetId, String fileId, FeignException feignException) {
Request request = feignException.request();
String httpMethod = request == null || request.httpMethod() == null
? "UNKNOWN"
: request.httpMethod().name();
String requestUrl = request == null || request.url() == null
? "UNKNOWN"
: request.url();
String responseBody = resolveFeignResponseBody(feignException);
String rootCauseChain = buildCauseChain(feignException, 12);
log.error(
"PdfTextExtract call failed with FeignException, datasetId={}, fileId={}, status={}, method={}, url={}, responseBody=\n{}\nrootCauseChain={}",
datasetId,
fileId,
feignException.status(),
httpMethod,
requestUrl,
responseBody,
rootCauseChain,
feignException
);
}
private String resolveFeignResponseBody(FeignException feignException) {
String responseBody = feignException.contentUTF8();
if (responseBody == null || responseBody.isBlank()) {
responseBody = feignException.getMessage();
}
if (responseBody == null || responseBody.isBlank()) {
return "EMPTY_RESPONSE_BODY";
}
return responseBody;
}
private String buildCauseChain(Throwable throwable, int maxDepth) {
StringBuilder causeChain = new StringBuilder();
Throwable current = throwable;
int depth = 0;
while (current != null && depth < maxDepth) {
if (causeChain.length() > 0) {
causeChain.append(" <- ");
}
causeChain.append(current.getClass().getSimpleName())
.append(": ")
.append(normalizeCauseMessage(current.getMessage()));
current = current.getCause();
depth++;
}
if (current != null) {
causeChain.append(" <- ...");
}
return causeChain.toString();
}
private String normalizeCauseMessage(String message) {
if (message == null || message.isBlank()) {
return "EMPTY_MESSAGE";
}
return message.replace("\r", " ").replace("\n", " ").trim();
}
} }