深入Sand之--Message分析

原创 2006年06月08日 17:33:00

                                                                             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来解决.

产生随机数:sand()和rand()函数用法

个人认为较为可靠的产生随机数的代码范例: 例如产生 min~max 范围的整数随机数 #include   #include   #include   # define MIN 10...
  • xiongchuquan
  • xiongchuquan
  • 2014年03月23日 21:42
  • 781

深入理解 RocketMQ

本文对RocketMQ的仅做理论性阐述,以便更深入的理解RocketMQ的内部机制,遇到棘手的问题更容易入手解决。关于代码实战请参考鄙人的另一篇文章:RocketMQ 入门使用详解...
  • zhglance
  • zhglance
  • 2017年02月13日 22:42
  • 1217

[深入理解Android卷二 全文-第二章]深入理解Java Binder和MessageQueue

由于《深入理解Android 卷一》和《深入理解Android卷二》不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第2章  深入理解Java...
  • Innost
  • Innost
  • 2015年08月03日 10:39
  • 5402

详细讲解Android中的Message的源码

相信大家对于Android中的Handler是在为熟悉不过了,但是要知道,Handler就其本身而言只是一个壳子,真正在内部起到作用的是Message这个类,对于Message这个类,相信大家也不会陌...
  • zhangjiaofa
  • zhangjiaofa
  • 2014年12月29日 12:02
  • 1752

深入java NIO系列之缓冲区分析与源码解读(一)

数据从磁盘移动到进程的内存区域整个过程:进程发起read()系统调用,要求其缓冲区被填满,内核随即要求磁盘控制硬件发送命令,磁盘控制器直接将数据写入内核的内存缓冲区中,该过程通过DMA来完成,无需主C...
  • miliermili
  • miliermili
  • 2014年03月12日 22:48
  • 3332

《深入理解Spark-核心思想与源码分析》读书笔记(1)

《深入理解Spark-核心思想与源码分析》这本书的读书笔记,主要还是学习源码...
  • FishSeeker
  • FishSeeker
  • 2017年02月26日 22:35
  • 550

深入解析Glide源码

Glide 是 Google的开源项目, Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主...
  • u012124438
  • u012124438
  • 2017年06月23日 09:30
  • 2884

《深入理解mybatis原理》系列文章

如何细粒度地控制你的MyBatis二级缓存(mybatis-enhanced-cache插件实现) 本文介绍如何细粒度地控制你的MyBatis二级缓存,以及对应的mybatis-enhanced-...
  • xcwll314
  • xcwll314
  • 2015年09月25日 17:02
  • 516

Spring MVC深入分析(快速入门,由浅入深)

 目录  一、前言 二、spring mvc 核心类与接口 三、spring mvc 核心流程图 四、spring mvc DispatcherServlet说明 五、spring...
  • chenleixing
  • chenleixing
  • 2015年02月02日 17:01
  • 2161

sk_buff结构分析

前言: 以下是根据《深入理解Linux网络技术内幕》对sk_buff的相关总结,由于是刚刚看这本书(太厚了),不免在前期出现错误,随着对此书的深入我会在修改前面的错误,也希望各位牛人给予指点。帮助我...
  • Decisiveness
  • Decisiveness
  • 2016年05月23日 14:05
  • 486
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入Sand之--Message分析
举报原因:
原因补充:

(最多只允许输入30个字)