package com.vincent.rsf.openApi.feign.wms.fallback;
|
|
import com.vincent.rsf.framework.common.R;
|
import com.vincent.rsf.openApi.entity.phyz.InventoryQueryCondition;
|
import com.vincent.rsf.openApi.feign.wms.WmsServerFeignClient;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Component;
|
|
/**
|
* WMS Server Feign客户端降级处理
|
*/
|
@Slf4j
|
@Component
|
public class WmsServerFeignClientFallback implements WmsServerFeignClient {
|
|
@Override
|
public R queryInventoryDetails(InventoryQueryCondition condition) {
|
return queryInventoryDetails(condition, null);
|
}
|
|
/**
|
* 库存查询明细降级处理(带异常信息)
|
* @param condition 查询条件
|
* @param throwable 异常信息(可选)
|
* @return 错误响应
|
*/
|
public R queryInventoryDetails(InventoryQueryCondition condition, Throwable throwable) {
|
log.error("调用WMS Server库存查询明细接口失败,触发降级处理", throwable);
|
String errorMessage = filterErrorMessage(throwable);
|
return R.error(errorMessage);
|
}
|
|
@Override
|
public R queryInventorySummary(InventoryQueryCondition condition) {
|
return queryInventorySummary(condition, null);
|
}
|
|
/**
|
* 库存查询汇总降级处理(带异常信息)
|
* @param condition 查询条件
|
* @param throwable 异常信息(可选)
|
* @return 错误响应
|
*/
|
public R queryInventorySummary(InventoryQueryCondition condition, Throwable throwable) {
|
log.error("调用WMS Server库存查询汇总接口失败,触发降级处理", throwable);
|
String errorMessage = filterErrorMessage(throwable);
|
return R.error(errorMessage);
|
}
|
|
/**
|
* 过滤错误消息中的URL,只保留错误类型
|
* @param throwable 异常对象(可选)
|
* @return 过滤后的完整错误消息(包含"查询失败:"前缀)
|
*/
|
public static String filterErrorMessage(Throwable throwable) {
|
if (throwable == null) {
|
return "查询失败:服务调用失败,请稍后重试";
|
}
|
return filterErrorMessage(throwable.getMessage());
|
}
|
|
/**
|
* 过滤错误消息中的URL,只保留错误类型
|
* @param errorMessage 错误消息字符串(可选)
|
* @return 过滤后的完整错误消息(包含"查询失败:"前缀)
|
*/
|
public static String filterErrorMessage(String errorMessage) {
|
if (errorMessage == null || errorMessage.isEmpty()) {
|
return "查询失败:未知错误";
|
}
|
|
String filteredMessage = errorMessage;
|
|
// 如果包含"executing",说明是HTTP请求错误,去掉URL部分
|
if (filteredMessage.contains("executing")) {
|
int executingIndex = filteredMessage.indexOf("executing");
|
if (executingIndex > 0) {
|
// 提取"executing"之前的部分(如"Read timed out")
|
filteredMessage = filteredMessage.substring(0, executingIndex).trim();
|
} else {
|
// 如果"executing"在开头,使用默认错误消息
|
filteredMessage = "请求超时";
|
}
|
}
|
// 如果包含"http://"或"https://",也尝试去掉URL部分
|
else if (filteredMessage.contains("http://") || filteredMessage.contains("https://")) {
|
// 使用正则表达式去掉URL
|
filteredMessage = filteredMessage.replaceAll("https?://[^\\s]+", "").trim();
|
if (filteredMessage.isEmpty()) {
|
filteredMessage = "请求失败";
|
}
|
}
|
|
// 如果过滤后的消息为空,使用默认错误消息
|
if (filteredMessage.isEmpty()) {
|
filteredMessage = "未知错误";
|
}
|
|
// 返回包含"查询失败:"前缀的完整错误消息
|
return "查询失败:" + filteredMessage;
|
}
|
}
|