CreoOtkPluging/SHRINKWRAP_OPTIMIZATION.md
sladro 444307aea3 优化Shrinkwrap接口 - 解决复杂模型500错误问题
## 主要改进
- 新增动态超时机制:支持timeout_seconds参数(10-300秒)
- 增强异常处理:细分OTK异常类型,提供具体错误信息
- 保持向后兼容:新参数可选,不影响现有API

## 技术细节
- ShrinkwrapManager.h: 添加timeout_seconds字段
- ShellExportHandler.cpp: 实现超时参数解析和验证
- MFCCreoDll.cpp: HTTP层支持动态超时控制
- ShrinkwrapManager.cpp: 细分pfcXToolkitError等异常类型

## 解决问题
- 复杂模型处理超时导致的504错误
- 异常信息不明确难以定位问题
- 固定30秒超时限制了大模型处理能力

## 文档和测试
- SHRINKWRAP_OPTIMIZATION.md: 完整使用说明
- test_timeout.py/bat: 自动化和手动测试工具
- 更新CLAUDE.md项目文档

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-28 16:05:46 +08:00

3.8 KiB
Raw Blame History

Shrinkwrap接口优化说明

问题描述

/api/creo/shrinkwrap/shell 接口在处理复杂模型时容易出现500内部错误主要原因

  1. 固定30秒超时对复杂模型不够
  2. 错误信息不明确,难以定位问题原因

优化方案

1. 动态超时机制

  • 新增参数: timeout_seconds(可选)
  • 默认值: 30秒
  • 有效范围: 10-300秒自动限制
  • 使用方式: 在请求JSON中添加 "timeout_seconds": 120

2. 增强错误处理

区分不同类型的OTK异常提供明确错误信息

  • pfcXToolkitError: "OTK Toolkit Error: Creo operation failed..."
  • pfcXBadArgument: "Invalid Parameters: One or more shrinkwrap parameters..."
  • xBadAlloc: "Memory Error: Insufficient memory to process the model..."
  • std::bad_alloc: "System Memory Error: Out of memory..."
  • 通用错误: "Unknown Error: An unexpected error occurred..."

3. 修改的文件

ShrinkwrapManager.h

struct ShrinkwrapShellRequest {
    // ... 其他字段
    int timeout_seconds = 30;  // 新增超时参数
};

ShellExportHandler.cpp

// 解析超时参数默认30秒最大300秒
request.timeout_seconds = ExtractJsonIntValue(json_body, "timeout_seconds", 30);
if (request.timeout_seconds < 10) {
    request.timeout_seconds = 10;  // 最小10秒
}
if (request.timeout_seconds > 300) {
    request.timeout_seconds = 300; // 最大300秒
}

MFCCreoDll.cpp

// 动态解析超时参数
int timeout_seconds = 30;
std::regex timeout_regex("\"timeout_seconds\"\\s*:\\s*(\\d+)");
// ... 解析逻辑

// 使用动态超时
int timeout_ms = timeout_seconds * 1000;

ShrinkwrapManager.cpp

// 细分异常处理
try {
    shrinkwrap_model = ExecuteOTKShrinkwrap(current_model, processed_request);
} catch (const pfcXToolkitError& e) {
    result.error_message = "OTK Toolkit Error: Creo operation failed...";
} catch (const pfcXBadArgument& e) {
    result.error_message = "Invalid Parameters: One or more shrinkwrap parameters...";
} catch (const pfcXToolkitOutOfMemory& e) {
    result.error_message = "Memory Error: Insufficient memory to process the model...";
} catch (const std::bad_alloc& e) {
    result.error_message = "System Memory Error: Out of memory...";
}
// ... 其他异常类型

使用示例

标准请求使用默认30秒超时

{
  "software_type": "creo",
  "quality": 5,
  "output_file_path": "output.prt"
}

长时间操作使用120秒超时

{
  "software_type": "creo", 
  "quality": 8,
  "output_file_path": "complex_model.prt",
  "timeout_seconds": 120
}

快速操作使用15秒超时

{
  "software_type": "creo",
  "preset": "fast",
  "output_file_path": "simple_model.prt",
  "timeout_seconds": 15
}

测试方法

使用Python测试

python test_timeout.py
python test_timeout.py 120  # 测试120秒超时

使用批处理测试

test_timeout.bat

使用curl测试

curl -X POST http://localhost:12345/api/creo/shrinkwrap/shell \
  -H "Content-Type: application/json" \
  -d '{"software_type":"creo","quality":5,"output_file_path":"test.prt","timeout_seconds":60}'

向后兼容性

  • 所有现有API调用保持完全兼容
  • timeout_seconds参数为可选未指定时使用默认30秒
  • 响应格式不变

预期效果

  1. 复杂模型处理: 通过增加超时时间减少504错误
  2. 错误诊断: 通过细分错误类型快速定位问题
  3. 用户体验: 提供明确的错误信息和解决建议
  4. 系统稳定性: 更好的异常处理避免系统崩溃

注意事项

  1. 超时时间过长会占用更多系统资源
  2. 复杂模型建议配合 preset: "fast" 使用
  3. 内存不足时应减少quality参数或简化模型
  4. 服务端最大允许300秒超时超过将被限制