使用Cloud API的Composite API触发ConcurrentDataChangeException,求OOB重试方案
问题解答
核心结论
ClaimCenter OOB(开箱即用)的Cloud API没有内置针对ConcurrentDataChangeException的自动重试机制,官方文档也未提供相关配置项来开启该功能。
可行解决方案
1. 自定义Cloud API扩展实现重试逻辑
通过扩展ClaimCenter Cloud API的业务逻辑层或拦截器,捕获ConcurrentDataChangeException并实现自动重试:
- 可以在对应的Resource类(比如处理服务请求创建的Resource)中重写方法,添加重试逻辑,推荐使用指数退避重试来避免频繁冲突。
- 伪代码示例:
public class CustomServiceRequestResource extends com.guidewire.cc.rest.api.claim.v1.ServiceRequestResource { private static final int MAX_RETRIES = 3; private static final long INITIAL_BACKOFF = 100; // 初始退避时间(毫秒) @Override public Response createServiceRequest(ServiceRequest request) { int retryAttempts = 0; while (retryAttempts < MAX_RETRIES) { try { // 执行原有创建逻辑 return super.createServiceRequest(request); } catch (ConcurrentDataChangeException ex) { retryAttempts++; if (retryAttempts >= MAX_RETRIES) { throw ex; // 超过重试次数,抛出原异常 } // 指数退避等待 long backoffTime = INITIAL_BACKOFF * (long) Math.pow(2, retryAttempts - 1); try { Thread.sleep(backoffTime); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("Retry interrupted", ie); } } } return null; } } - 注意事项:确保重试的操作是幂等的,避免重复创建服务请求;控制重试次数和退避时间,防止给系统带来额外负载。
2. 优化Composite API请求结构
减少单次Composite请求中的并发冲突点:
- 拆分Composite请求,将可能触发冲突的操作分开执行,避免同时修改同一Claim资源的多个属性。
- 调整请求顺序,将依赖强的操作放在前面执行,比如先完成Claim的基础信息更新,再创建关联的服务请求。
3. 调用端重试优化(若无法修改Cloud API)
如果只能在调用端处理,采用以下策略降低冲突概率:
- 使用指数退避重试,不要立即重试,每次重试的等待时间逐步翻倍。
- 添加幂等标识:如果Cloud API支持(部分版本的ClaimCenter Cloud API支持
Idempotency-Key请求头),生成唯一的幂等键,确保重复请求不会产生重复的业务数据。
社区反馈
不少用户在ClaimCenter开发者社区反馈过同类问题,主流的解决方式是通过自定义扩展实现重试逻辑,或者调整Composite请求的结构来减少并发冲突。
内容的提问来源于stack exchange,提问作者Kiran Panga
相关产品推荐
相关产品推荐

