更新 knowledge.md

This commit is contained in:
ycl
2025-09-07 14:30:26 +08:00
parent b8255ca3a0
commit 636cb8a226

View File

@@ -1411,7 +1411,7 @@ class CreateUserBto { //对应实体user
- **定义与用途:** TOCO支持领域消息通过创建和订阅领域消息可以监听聚合对象的状态变化创建、删除、更新)TOCO会自动生成消息的发送逻辑
- **关键配置:** 名称(小写字母+下划线), 由于消息是全局可见所以TOCO限制了名称项目级别不能重复; **注意** 在监听状态变化的时候不要命名为某个字段的变更,比如 order_payed, 也不要按照业务语义命名例如order_payed_complete,因为实际上是order表的任意变更都会受到消息因此命名为order_changed或order_updated更准确的表达了消息的触发语义 同理对于create事件一般命名为 xxx_created对于delete时间一般命名为 xxx_deleted
- **与聚合的关系:** 每个聚合下可以定义多个领域消息,每次可以监听聚合下面其中一个实体的状态变更
- **如何创建/生成:** 创建领域消息,需要先去顶聚合,然后确定需要监听的实体以及监听的变更类型
- **如何创建/生成:** 创建领域消息,需要先确定聚合,然后确定需要监听的实体以及监听的变更类型
- **最佳实践** 如果只是字段区别,应该修改现有的领域消息,增加相应的字段即可,而不是新创建一个领域消息;
- **领域消息的定义表达**
- 以Json表达Json Schema 定义如下:
@@ -1440,9 +1440,55 @@ class CreateUserBto { //对应实体user
- **唯一标识符位置:** 其对应的标识符在类注解@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 普通消息 CommonMessage)**
- **定义与用途:** TOCO支持普通消息普通消息可以自由定义消息内容。定义消息后TOCO可以生成消息体以及消息的发送模板只需调用这个发送函数即可发送消息; 消息队列的创建配置等工作TOCO自动完成
- **关键配置:** 名称(小写字母+下划线), 由于消息是全局可见所以TOCO限制了名称项目级别不能重复;
- **领域消息的定义表达**
- 以Json表达Json Schema 定义如下:
```json
{
"type":"object",
"properties": {
"name":{ "type": "string", "description": "消息名称,单词之间使用下划线分割总称不超过32个字符,一个模块的领域消息名称不能重复"},
"description": { "type": "string","description": "消息描述不超过128个字符"},
"uuid":{ "type": "string", "description": "唯一标识符,创建时为空,更新时必填"},
"moduleName":{ "type": "string", "description": "所属模块,创建时必填,更新时可空"},
"delay": {"type": "boolean","description": "是否是延迟消息,如果是延时消息,在生成的的发送消息函数里添加延迟时间参数"},
"transactional": {"type": "boolean","description": "是否是事务消息,如果是事务消息,消息的发送和外层事务保持一致"},
"fieldList":{
"type":"array", "description": "消息属性列表",
"items":{
"type": "object",
"properties":{
"name": { "type": "string","description": "字段名称英文下划线分割不超过32字符"},
"uuid":{ "type": "string","description": "字段类型为Enum或Eo时必填对应的Enum或Eo标识符" } ,
"type":{ "type": "string","description": "字段类型String,Integer,Long,Float,Double,Boolean,Date,Eo,Enum,BigDecimal,List" },
"innerUuid":{"type": "string", "description": "当innerType为Eo或Enum时对应的标识符"},
"innerType": { "type": "string", "description": "List元素类型String,Integer,Long,Float,Double,Boolean,Date,Eo,Enum,BigDecimal"}
},
"required":[ "name","type"]
}
}
},
"required":["name","description"]
}
```
**代码产物和修改建议**
- **消息载体类:** 在manager层生成一个Java类封装消息体
- **命名规则:** 类名为${commonMessageName}Mo
- **职责:** 消息内容载体
- **类路径:** ```**.manager.mo```
- **唯一标识符位置:** 其对应的标识符在类注解@AutoGenerated中指定, uuid规则: ${CommonMessage在TOCO中的uuid}|MO|DEFINITION
- **发送类** 在service层生成一个Java类封装消息发送逻辑
- **命名规则:** 类型名为 ${commonMessageName}MoMessageSender
- **职责** 封装发送函数,作为消息发送的入口
- **类路径:** ```**.service.mq.producer```
- **唯一标识符位置:** 其对应的标识符在类注解@AutoGenerated中指定, uuid规则: ${CommonMessage在TOCO中的uuid}|MO|PRODUCER
- **例子**
- 在用户注册成功后需要给用户发一封邮件可以定义个普通消息名称为user_registered, 包含了字段: long user_id, String nick_name 生成代码后,会生成 类:<code> UserRegisteredMo {Long userId;String nickName;}</code> 和一个发送类 <code>UserRegisteredMoMessageSender {void send(UserRegisteredMo message);}</code>
#### **2.18 订阅消息 (SubscribeMessage)**
- **定义与用途:** TOCO支持订阅消息, 订阅消息后生成代码会生成消息消费的模板代码, 后续只需在对应的模板代码里填写业务逻辑,而无需关注如何订阅消息的代码逻辑 **注意**在TOCO中消息订阅按照模块独立订阅一个消息可以被多个模块订阅同一个消息在一个模块中只能订阅一次
#### **2.19 订阅消息 (SubscribeMessage)**
- **定义与用途:** TOCO支持订阅消息(普通消息和领域消息), 订阅消息后生成代码会生成消息消费的模板代码, 后续只需在对应的模板代码里填写业务逻辑,而无需关注如何订阅消息的代码逻辑 **注意**在TOCO中消息订阅按照模块独立订阅一个消息可以被多个模块订阅同一个消息在一个模块中只能订阅一次
- **订阅消息的定义表达**
- 以Json表达Json Schema 定义如下: 通过msgId或者msgName指定订阅的消息
```json