بنقرة واحدة
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 ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
在后端项目中设计或修改接口、DTO、错误码、鉴权、幂等、分页、批量操作和前后端联调契约时使用。适用于后端 profile,输出清晰的接口边界、兼容风险和验证路径。
将后端技术方案拆解为接口、应用服务、领域/业务逻辑、数据访问、消息/定时任务、迁移脚本和测试任务时使用。用于补充通用 implementation-planning 的后端归组口径。
分析后端接口、数据库访问、RPC/HTTP 调用、批处理、消息消费、事务和缓存相关性能风险时使用。强调证据、数据规模、低风险优化和回滚方案。
前端接入接口、修复提交失败、核对列表/详情/保存字段、处理类型漂移或空值风险时使用。输出契约不一致点、收敛方案和回归建议。
排查并修复前端渲染、状态、表单、表格、路由、API 映射、异步时序和性能回归问题时使用。要求可复现、可定位、可验证、最小修复。
在既有前端项目中新增或扩展页面、表单、列表、弹窗、批量操作、导入导出和权限交互时使用。强调先理解调用链、复用现有结构、最小改动落地。
| 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());
}
}