원클릭으로
common-components
在 cola-java 项目中使用公共组件(缓存、分布式锁、MongoDB、MQ、XxlJob、异步工具、重试、Gateway 模板、Executor 模板)时,参考本指南选择正确的 API 和模式。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
在 cola-java 项目中使用公共组件(缓存、分布式锁、MongoDB、MQ、XxlJob、异步工具、重试、Gateway 模板、Executor 模板)时,参考本指南选择正确的 API 和模式。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
在后端项目中设计或修改接口、DTO、错误码、鉴权、幂等、分页、批量操作和前后端联调契约时使用。适用于后端 profile,输出清晰的接口边界、兼容风险和验证路径。
将后端技术方案拆解为接口、应用服务、领域/业务逻辑、数据访问、消息/定时任务、迁移脚本和测试任务时使用。用于补充通用 implementation-planning 的后端归组口径。
分析后端接口、数据库访问、RPC/HTTP 调用、批处理、消息消费、事务和缓存相关性能风险时使用。强调证据、数据规模、低风险优化和回滚方案。
前端接入接口、修复提交失败、核对列表/详情/保存字段、处理类型漂移或空值风险时使用。输出契约不一致点、收敛方案和回归建议。
排查并修复前端渲染、状态、表单、表格、路由、API 映射、异步时序和性能回归问题时使用。要求可复现、可定位、可验证、最小修复。
在既有前端项目中新增或扩展页面、表单、列表、弹窗、批量操作、导入导出和权限交互时使用。强调先理解调用链、复用现有结构、最小改动落地。
SOC 직업 분류 기준
| name | common-components |
| displayName | cola-java 公共组件使用指南 |
| description | 在 cola-java 项目中使用公共组件(缓存、分布式锁、MongoDB、MQ、XxlJob、异步工具、重试、Gateway 模板、Executor 模板)时,参考本指南选择正确的 API 和模式。 |
| triggers | ["缓存","分布式锁","MongoDB","MQ","消费者","XxlJob","定时任务","异步","AsyncUtils","重试","Gateway模板","Executor模板","bulkInsert","bulkUpsert"] |
| autoTrigger | true |
| version | 1.0.2 |
当用户在 cola-java 项目中涉及缓存、锁、消息队列、MongoDB、定时任务、异步批处理、重试等场景时,指导其使用项目统一的公共组件 API,避免重复造轮子或引入不一致的实现方式。
AGENTS.md 文件cola-java// cacheScope:CacheScope.REMOTE(Redis)/ LOCAL(Caffeine)/ BOTH(双缓存)
@ZnyfCached(name = "product:detail", key = "#{id}", expireInSeconds = 1800,
cacheScope = CacheScope.REMOTE)
public ProductDTO getProductById(Long id) {
return productGateway.getById(id);
}
@ZnyfLock(name = "order:create", key = "#{cmd.userId}_#{cmd.productId}", expireInSeconds = 120)
public Result<Void> createOrder(CreateOrderCmd cmd) { ... }
@Resource
private ILockGateway lockGateway;
boolean locked = lockGateway.autoLock(OrderDO.class,
cmd.getUserId() + "_" + cmd.getProductId(),
() -> orderGateway.create(cmd));
if (!locked) {
throw new BusinessException("操作过于频繁,请稍后重试");
}
// 接口继承 IServiceRepository
public interface IOrderGateway extends IServiceRepository<OrderDO> {
}
// 实现类加 @DS 指定数据源,继承 ServiceRepository 获得 bulkInsert/bulkUpsert 等方法
@DS("db-sharding")
@Component
public class OrderGateway extends ServiceRepository<IOrderRepository, OrderDO>
implements IOrderGateway {
}
| 策略值 | 分表规则 |
|---|---|
amazon-site-code | 按 Amazon 站点 |
hash-code | 哈希值求余 |
number-code | 数字值求余 |
year-month-code | 按月 |
year-month-day-code | 按天 |
orderGateway.bulkInsert(orders);
orderGateway.bulkUpsert(orders);
// filterFields:匹配条件字段;onlyUpdateFields:仅更新这些字段(null 表示全量更新)
gateway.bulkUpsert(products, List.of("sourceId", "sku"),
List.of("priceInfo.price", "title"), null, true, "");
标准实现参见 mq-consumer.mdc 规则,核心模式:
@Component
public class XxxConsumer extends RabbitBaseHandler {
@RabbitListener(queues = "queue_name", concurrency = "1")
public void listener(Message message, Channel channel) {
super.onMessage(message, channel, XxxDTO.class,
mqModel -> processMessage(mqModel));
}
}
@XxlJob("syncAmazonDataTask")
public ReturnT<String> syncAmazonData() {
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
List<String> siteList = AmazonSiteCodeEnum.findConditionSiteCode(
site -> XXLShardingUtil.needProcess(shardIndex, shardTotal, site.getIndex())
);
siteList.forEach(this::processAmazonSite);
return ReturnT.SUCCESS;
}
// 将 skus 按每批 100 条并发处理,收集结果
List<String> result = AsyncUtils.doPartitionAsync(skus, 100,
(params, allWrappers) -> params.stream()
.map(this::processAndReturn)
.collect(Collectors.toList()));
// 重试 3 次,每次间隔 1000ms
ProductDTO product = RetryUtils.retry(
() -> amazonApiGateway.getProduct(asin), 3, 1000);
展示日志、参数校验、事务、异常处理的标准组合写法:
@Component
@Slf4j
public class OrderCreateCmdExe {
@Resource private IOrderGateway orderGateway;
@Resource private IInventoryGateway inventoryGateway;
@Transactional(rollbackFor = Exception.class)
public Result<Long> execute(CreateOrderCmd cmd) {
log.info("创建订单开始, userId={}, productId={}", cmd.getUserId(), cmd.getProductId());
// 1. 参数校验
if (cmd.getUserId() == null) throw new BusinessException("用户ID不能为空");
if (cmd.getQuantity() == null || cmd.getQuantity() <= 0)
throw new BusinessException("购买数量必须大于0");
// 2. 业务校验
InventoryDO inventory = inventoryGateway.getByProductId(cmd.getProductId());
if (inventory == null || inventory.getStock() < cmd.getQuantity()) {
throw new BusinessException("库存不足");
}
// 3. 写操作
OrderDO order = new OrderDO();
order.setUserId(cmd.getUserId());
order.setProductId(cmd.getProductId());
order.setQuantity(cmd.getQuantity());
orderGateway.save(order);
inventoryGateway.deduct(cmd.getProductId(), cmd.getQuantity());
log.info("创建订单成功, orderId={}", order.getId());
return Result.success(order.getId());
}
}