Sand Message分析
目标:分析Sand中Message的设计思路,使用OWL/RDF描述语言,设计一套通用的CRUD消息.
具体内容:
一、Sand中Message的继承体系
SandMessage
SandInstanceMessage
NodeInstance(与当前的目标无关)
SandStructMessage(关键)
...
SandTransimitMessage
SandVerbMessage
AggregateUpdate(关键)
SandCollectionMessage(关键)
...
SandQueryMessage(关键)
...
SandUpdateMessage(关键)
...
从以上的类体系可以看得出,有四个关键的接口:SandStructMessage、SandCollectionMessage、SandQueryMessage和
SandUpdateMessage. 它们各自的职责如下;
1. SandStructMessage: CRUD消息中业务内容的定义
2. SandCollectionMessage: Query的结果集,包含了多个SandStructMessage.
3. SandQueryMessage: query消息
4. SandUpdateMessage: update消息, 只操作一个SandStructMessage
5. AggregateUpdate: update消息, 可以操作多个SandStructMessage
二、关键类/接口分析
1. SandStructMessage
SandStructMessage定义了CRUD的业务对象。它上面没有提供特殊的操作。
2. SandQueryMessage
SandQueryMessage是query message, 它的特殊操作如下;
@ addMatchInfo(SandAttrVal)
@ setMatchInfo(SandAttrVal[])
@ setOrderBy(String)/getOrderBy()
@ setOperationFields(String)/getOperationFields()
@ matches(SandStructMessage)
@ setMaxReturn(int)/getMaxReturn()
其中关键的是SandAttrVal类,在这个类中,有两个属性:attr和val. attr表示属性的名称, val表示这个属性的匹配
条件(可以带匹配条件,比如:!=20、=20).
3. SandCollectionMessage
SandCollectionMessage是一个容器,它用来表示SandQueryMessage返回的结果集。也就是用来存储多个SandInstanceMessage
对象(我们当前只关心SandStructMessage)。比如,它上面有一些特殊的方法:
@ removeElement/addElement(SandInstanceMessage)
@ getElements()
@ setQueryResult/getQueryResult()---返回对应的query function,query function是什么东东?
4. SandUpdateMessage
表示对一个SandStructMessage进行update,它上面的特殊方法为:
@ setAction(int)/getAction()
@ setInstance(SandStructMessage)/getInstance()
其中setAction中的action有以下几个值:ACTION_UPDATE, ACTION_ADD, ACTION_DELETE, ACTION_UNDEFINED.
问题: 它是如何解决"乐观锁/悲观锁"问题?
答: 它在对象中使用一个vision属性,用来唯一标识版本(保证更新之前别人没有更新过)
5. AggregateUpdate
提供同时对多个SandStructMessage进行update的能力。它实现的时候聚合了多个SandUpdtaeMessage对象。关键方法如下:
@ addUpdate(SandUpdateMessage)
@ setUpdates(SandUpdateMessage[])
@ getUpdates()
三、基于OWL/RDF描述的通用CRUD消息设计
类体系如下:
CRUDMessage
OWLMessage
...
VerbMessage
AggregateUpdateMessage
UpdateMessage
...
QueryMessage
...
CollectionMessage
...
详细说明:
1. CRUDMessage:所有消息的基类
2. OWLmessage: 定义CURD操作的"数据模型",例如Person...
使用通用的OWL定义一个业务对象类即可.
3. QueryMessage: query Message
它有一些特殊的属性:matchs, maxResult, minResult, orderBy. 其中matchs是一个ObjectProperty,
它的range是MatchItem.
MatchItem有两个属性:attr和val。 attr的range是Property, val是一个String,它包含了逻辑操作符
(如 >, !=)。
4. CollectionMessage: query出来的结果集, 它聚合了多个OWLMessage实例
它主要有一个属性:
<owl:ObjectProperty rdf:ID="owlMsgs">
<rdfs:domain rdf:resource="#CollectionMessage"/>
<rdfs:range rdf:resource="#OWLMessage"/>
</owl:ObjectProperty>
这个属性可以多个值
5. UpdateMessage: update一个OWLMessage。它聚合了一个OWLMessage和一个操作(update, add, delete)
它主要有两个属性:
<owl:ObjectProperty rdf:ID="owlMsg">
<rdfs:domain rdf:resource="#UpdtaeMessage"/>
<rdfs:range rdf:resource="#OWLMessage"/>
</owl:ObjectProperty>
<owl:ObjectProperty rdf:ID="action">
<rdfs:domain rdf:resource="#UpdtaeMessage"/>
<rdfs:range rdf:resource="#Action"/>
</owl:ObjectProperty>
Action是一个枚举类型, 可以有以下值:update, add, delete
6. AggregateUpdateMessage: 同时更新多个OWLMessage
这个OWL类有一个属性:
<owl:ObjectProperty rdf:ID="updates">
<rdfs:domain rdf:resource="#AggregateUpdtaeMessage"/>
<rdfs:range rdf:resource="UpdateMessage"/>
</owl:ObjectProperty>
这个属性可以多个值.
7. 解决"乐观锁/悲观锁"问题
在OWLMessage中保存一个vision来解决.