更新 knowledge.md

This commit is contained in:
ycl
2025-09-03 19:02:14 +08:00
parent 8dd43e784f
commit f8d5a68fbc

View File

@@ -1407,6 +1407,67 @@ class CreateUserBto { //对应实体user
- 自定义查询时框架不自动生成代码(需要手动编写全部代码) - 自定义查询时框架不自动生成代码(需要手动编写全部代码)
- 各层代码位置严格遵守**3.2 项目结构与导航**必须有mapper层、service层、DO对象、DTO对象API返回数据必须有VO对象 - 各层代码位置严格遵守**3.2 项目结构与导航**必须有mapper层、service层、DO对象、DTO对象API返回数据必须有VO对象
#### **2.17 领域消息DomainMessage)**
- **定义与用途:** TOCO支持领域消息通过创建和订阅领域消息可以监听聚合对象的状态变化创建、删除、更新)TOCO会自动生成消息的发送逻辑
- **关键配置:** 名称(小写字母+下划线), 由于消息是全局可见所以TOCO限制了名称项目级别不能重复
- **与聚合的关系:** 每个聚合下可以定义多个领域消息,每次可以监听聚合下面其中一个实体的状态变更
- **如何创建/生成:** 创建领域消息,需要先去顶聚合,然后确定需要监听的实体以及监听的变更类型
- **领域消息的定义表达**
- 以Json表达Json Schema 定义如下:
```json
{
"type": "object", "required": ["name","description", "bo", "entity", "action","fields"],
"properties": {
"name": {"type": "string", "description": "消息名称,单词之间使用下划线分割总称不超过32个字符,一个模块的领域消息名称不能重复"},
"description": {"type": "string", "description": "消息描述不超过128个字符"},
"bo": {"type": "string", "description": "聚合名称"},
"entity": {"type": "string", "description": "监听的实体名称,必须归属于聚合"},
"fields": {"type": "array", "description": "指定消息里返回的entity的字段对应的字段名称","items": {"type": "string", "description": "字段名称"}},
"action": {"type": "string", "description": "监听的变更类型可选值create、update、delete"},
"delayInSeconds": {"type": "integer", "description": "延迟时间,单位为秒, 如果希望消息延迟消费,则设置该字段, 例如: 订单下单后5分钟未支付触发一个消息则可以监听订单的创建状态并且设置延迟时间5分钟这样消息会在5分钟后被消费"},
"uuid": {"type": "string", "description": "消息的uuid在更新领域消息时传入创建的时候不传"}
}
}
```
- **代码产物和修改建议**
- **发送逻辑** 会在相应聚合的实体中通过hibernate的监听器中实现消息的发生逻辑**不能修改**
- **生成产物:**
- **生成:** 在manager层生成一个Java类封装消息体
- **命名规则:** 类名为${domainMessageName}Mo
- **职责:** 消息内容载体
- **类路径:** ```**.manager.mo```
- **唯一标识符位置:** 其对应的标识符在类注解@AutoGenerated中指定, uuid规则: ${DomainMessage在TOCO中的uuid}|DMO|DEFINITION
- **例子**
用户聚合包含了user实体, 用户实体有 user_id user_name 字段那么创建一个领域消息名称为user_created描述为用户创建成功聚合名称为user实体名称为user监听的变更类型为create返回的字段为user_iduser_name。则会生一个类<code> UserCreatedMo {Long userId;String userName;}</code>特别的对于update的监听生成消息里会包含字段的前值命名以old结尾, 例如:<code>UserUpdatedMo {String userName ; String userNameOld;}</code>
#### **2.18 订阅消息 (SubscribeMessage)**
- **定义与用途:** TOCO支持订阅消息, 订阅消息后生成代码会生成消息消费的模板代码, 后续只需在对应的模板代码里填写业务逻辑,而无需关注如何订阅消息的代码逻辑 **注意**在TOCO中消息订阅按照模块独立订阅一个消息可以被多个模块订阅同一个消息在一个模块中只能订阅一次
- **订阅消息的定义表达**
- 以Json表达Json Schema 定义如下: 通过msgId或者msgName指定订阅的消息
```json
{
"type": "object", "required": ["moduleName"],
"msgId": {"type": "string", "description": "消息id"},
"msgName": {"type": "string", "description": "消息名称"},
"moduleName": {"type": "string", "description": "模块名称,指定消息被订阅到哪个模块"}
}
```
- **代码产物和修改建议**
- **Consumer类**
- **命名规则:** 在指定模块的的service层生成一个Java类封装了消息的消费类入口
- **命名规则:** 类名为${messageName}Consumer
- **职责:** 消息的消费类入口
- **类路径:** ```**.service.mq.consumer```
- **MsgHandler函数**
- **命名规则:** 在Consumer类中生成一个函数封装了消息的消费逻辑的函数入口
- **命名规则:** 函数名为handleMessage
- **职责:** 消息的消费函数入口,该函数以对应的消息作为参数
- **唯一标识符位置:** 其对应的标识符在函数@AutoGenerated中指定, uuid规则: ${模块id}_${DomainMessage在TOCO中的uuid}
- **修改建议**
- handleMessage函数中实现业务逻辑 如果消费成功返回ture; 处理失败返回false 消息会被多次投递
- 如果消息要实现幂等消费则需要在handleMessage函数上添加@Transactional注解同时在Consumer类中覆盖父函数 @Override boolean useDBIdempotentWithTransactional(){return true;}, 开启幂等机制
### **3 代码生成说明** ### **3 代码生成说明**
**3.1 技术栈** **3.1 技术栈**