现在的位置: 首页 > 综合 > 正文

Microsoft Offline Application Block学习笔记

2013年08月26日 ⁄ 综合 ⁄ 共 6609字 ⁄ 字号 评论关闭

MOAB初始化。
乡级系统运行时首先构造clsXuQiuChaXunKongZhi 实例。再构造过程中将构造MOAB的实例,注册事件、载入驻留数据及注册消息。
 
实现过程:
获得MOAB实例。
lixianKongZhi = OfflineBlockBuilder.Instance;
OfflineBlockBuilder 类是应用程序开发人员需要调用以实例化所有子系统的唯一类。通过OfflineBlockBuilder.Instance属性来创

建块生成器的实例。

注册事件。
a. 注册离线和在线状态变化事件
lixianKongZhi.ConnectionManager.ConnectionStateChangedEvent +=
    new ConnectionStateChangedEventHandler();
通过这行代码,MOAB监听到连接状态的改变便会触发ConnectionStateChangedEvent事件,通过将

ConnectionManagerConnectionStateChangedEvent()注册到ConnectionStateChangedEvent事件中,系统可以根据连接状态的改变设

置系统的运行状态。
ConnectionManagerConnectionStateChangedEvent()封装在clsXuQiuChaXunKongZhi类中,功能实现系统连接状态全局变量的赋值和

控制组件更新服务的启动与中止。(关于组件更新部分见后面的介绍)

b. 注册MOAB错误处理事件
FailsafeServiceAgent cuowuChuLi = lixianKongZhi.FailsafeServiceAgent;
 cuowuChuLi.ErrorEvent+= new MethodExecutionFailureReportEventHandler(FailSafeServiceAgentErrorEvent); 
注册错误事件处理过程,当出现异常时捕捉到错误根据错误信息处理异常并记录日志。

c. 生成系业务代表类(ServiceAgent)的实例并注册事件
 
Hrhy.FPMS.Xiang.YeWu.clsYeWuDaiBiao 业务代表类封装了数据的发送与获取方法。发送一个请求需要要调用的网络代表方法名称

和 响应请求的方法名称 这些方法都封装在clsYeWuDaiBiao类中,当请求提交后smart_client 返回数据会响应发送时传入的响应请

求的方法 ,因为系统的数据处理控制都封装在clsXuQiuChaXunKongZhi 类中,因此通过注册事件方式将业务代表类响应返回数据的

处理转移到clsXuQiuChaXunKongZhi 类中进行处理。详细解释参考下面章节
启动MOAB。
完成构造clsXuQiuChaXunKongZhi类后,调用clsXuQiuChaXunKongZhi实例中的YunXin() 过程启动 MOAB 。
 
a. 启动MOAB
 
通过OfflineBlockBuilder.Start() 方法启动OfflineBlockBuilder。

b. 重新提交未未响应的数据
  是将上次系统退出前提交的请求未得到反馈的请求重新发送请求。该重发过程与提交请求过程相同。

MOAB连接状态管理。
获得当前应用所运行的网络状态是联机还是脱机
MOAB通过注册连接状态变化事件,通过响应这个事件,当发生网络状态变化的时候,应用可以获得这个事件。注册代码实现部分请参

考本文MOAB初始化的注册事件。
连接状态变化事件响应
系统初始化时在clsXuQiuChaXunKongZhi类中在MOAB连接状态改变的事件中注册了ConnectionManagerConnectionStateChangedEvent

()作为连接状态发生变化的时候。
 
OfflineBlockBuilder.ConnectionManager.ConnectionStateChangedEvent事件出发时调用过程,其中处理流程:
a. 写日志文件
clsRiZhiChuLi.JiLuRiZhi("..........."+ args.CurrentState.ToString());
clsRiZhiChuLi 类封装日志处理,此处记录连接状态改变日志。

b. 获取网络状态
wangluoZhuangTai 是MOAB的网络状态属性。
private Microsoft.ApplicationBlocks.SmartClient.Offline.ConnectionState    wangluoZhuangTai;
通过 wangluoZhuangTai = args.CurrentState; 获取当前的状态

c. 在线判断
if(Microsoft.ApplicationBlocks.SmartClient.Offline.ConnectionState.OnLine == wangluoZhuangTai)
判断当前装态是否在线,如在线给系统在线状态属性赋值同时开始组件更新处理,反之给系统在线状态属性赋值同时停止组件更新。

有关组件更新的内容见章节4 组件更新实现机制。

强制连接状态发生变化
在某些特殊情况下需要强制离线或上线处理。强制离线或上线由主界面触发。其实现过程封装在clsXuQiuChaXunKongZhi类中。
a. 强制上线
 
通过调用OfflineBlockBuilder.ConnectionManager.GoOnline()方法,强制系统上线。

b. 强制离线
 
通过调用OfflineBlockBuilder.ConnectionManager.GoOffline()方法,强制系统离线。

强制上线/离线处理后,会出发ConnectionManagerConnectionStateChangedEvent MOAB连接状态编号的处理过程,该过程同系统监测

时状态改变触发处理。强制上线/离线后,系统已强制设置的状态为运行状态。

实现在线/离线工作。
MOAB离线/在线工作原理。
更新数据请求处理。
离线时更新数据请求同在线提交请求(Payload),将更新数据请求插入到MOAB的请求队列中,然后等待请求中注册的回调函数是否被

调用,在离线工作的情况下,所有得请求都会被缓存在MOAB的队列中,这些请求不会被执行知道连接状态发生变化。当系统上线后,

请求队列中的请求会按照FIFO的顺序,依次提交给MOAB的执行器执行,执行器根据请求的具体信息,调用相应的网络代理从数据源或

者WebService获得数据(本项目通过WebService获得数据)。如果在离线状态下关机或断电,MOAB对列中缓存的请求会丢失,所以本

系统会自动将所有得数据包括没有成功返回的请求信息保存起来,当系统重新运行时会加载这些信息,同时系统还会将没有返回响应

的数据重新封装成新的请求放入到MOAB的请求队列中,如果此时MOAB为上线则将更新数据请求发送到网络代理,否则在队列中等待

MOAB上线。
获得数据请求处理机制。
离线时获取数据的请求,系统在判断网络连接状态后,如果系统处于离线状态,为避免冗余请求发送到队列中,该获取数据的请求将

不会被执行。在系统运行过程中,系统中的数据始终为上次连接在线时最后一次获取的数据。

通过MOAB提交请求,不返回数据。
点击主界面的“需求录入”,打开“需求录入”窗体,打开窗体过程系统经过以下步骤:
 
获取需要提交的数据。
在“需求录入”窗体构造过程中,通过在ChuangJianShuJuJi() 中调用clsXuQiuChaXunKongZhi中的HuoDeShuJu(),获取最新的需求录

入数据项信息,根据该信息动态创建“需求录入”窗体中的输入数据项。
提交MOAB请求数据(PayLoad)
“需求录入”窗体中录入完成数据,点击“确定”将录入数据提交,“取消”则不进行提交而直接关闭窗体,所录入数据会丢失。
提交数据过程首先获取界面数据,然后调用clsXuQiuChaXunKongZhi 类中的XuQiuTiJiao()过程发送请求。
 
其中:
KongJianQuZhi() 功能实现从界面中获取录入的需求信息数据。
 
请求数据提交过程
a. 封装需要提交的数据和其他必备的信息成PayLoad,并发送请求。
XuQiuTiJiao()过程中首先发送请求,调用Hrhy.FPMS.Xiang.YeWu.clsYeWuDaiBiao中的XuQiuTiJiao()过程通过下面语句

this.FaSongQingQiuGengXinShuJu("XuQiuTiJiao","XuQiuTiJiaoFanHui",XuQiu);发送请求,同时将参数加入请求中:网络代表方法

名称、响应请求方法名称和更新数据。
Hrhy.FPMS.Xiang.YeWu.clsYeWuDaiBiao类中发送请求的处理
 
 其中变量的定义:
  构造PayLoad 对象
 
 发送请求
通过OfflineBlockBuilder.PayloadConsumer.Enqueue(messageToEnqueue);方法发送请求。
其中的网络代表类为Hrhy.FPMS.Xiang.YeWu.clsWangLuoDaiLi,通过调用WebService将数据更新到县级数据中心。Smart_client 根

据请求中的网络标识调用Hrhy.FPMS.Xiang.YeWu. clsWangLuoDaiLi类中的XuQiuTiJiao()过程。
 
其中的fuWu为WebService对象,通过调用fuWu中XuQiuTiJiao()过程将数据更新到县级数据中心。

b. 最后重新绑定主界面表格控件中数据源刷新表格显示的数据
this.jieMian.GengXinXuQiu(this.shujuGuanLi.HuoDeShuJu(clsChangLiang.SHUJU_XUQIU_WEIDAFU),
  this.shujuGuanLi.HuoDeShuJu(clsChangLiang.SHUJU_XUQIU_YIDAFU));

通过MOAB查询请求,返回数据。 
在主界面点击“刷新”按钮,会获取获取配置数据和需求数据的最新值。
刷新事件调用clsXuQiuChaXunKongZhi的ShuJuChaXun()过程,在上线状态时从县级获取最新的数据(需求数据、配置数据和基本数据)


 
在线网络代理通过数据源(本系统,通过WebService提供数据)获得数据。
请求提交后如果在线状态会调用clsWangLuoDaiLi类的XuQiuChaXun()过程。在XuQiuChaXun过程中调用 clsWangLuoDaiLi类的

QingQiuChuLi ()
 
a. 在QingQiuChuLi() 处理过程中首先创建ReferenceCacheDataPayload实例。ReferenceCacheDataPayload是定义那种专门用

来处理需要返回数据的请求。
b. 得到网络服务数据。
huanCunQingQiu.UpdateDataToReturn(ShuJu);
通过UpdateDataToReturn() 更新 Payload 中从远程服务返回的数据。

c. 得到OfflineBlockBuilder的实例。
OfflineBlockBuilder liXianShiLi = OfflineBlockBuilder.Instance;

d. 保存新数据到MOAB的应用缓存数据管理器。
if(!(huanCunQingQiu.IsRefreshMessage() && huanCunQingQiu.DataDefinition.Dirty == true))
其中的判断条件:
IsRefreshMessage() 表示是否已创建 Payload 来刷新参考数据项目。
DataDefinition.dirty,则意味着它已经在本地进行更改,但没有在服务器上进行更改。
当条件满足即数据已更新后,执行
//存数据放入到参考缓存数据块中
liXianShiLi.ReferenceDataCache.Store(huanCunQingQiu.DataDefinition,        

       huanCunQingQiu.Results);
ReferenceDataCache 是Offline Application Block 通过该封装程序公开带有支持联机/脱机方案附加功能的缓存行为。
系统将放回的更新数据保存到ReferenceDataCache 缓存中,本地缓存会从该缓存中获取数据。

e. 得到的数据置为干净。
liXianShiLi.ReferenceDataCache.MarkAsClean(
    huanCunQingQiu.DataDefinition.OriginalKey);
执行结果是如果参考数据缓存项目存在于缓存中,它会将该项目标记为 clean。这表示作为工作流(在指定的缓存项位置修改参考数

据项目)一部分而生成的消息已经进行了处理。QingQiuChuLi()过程最后返回ReferenceCacheDataPayload对象。

业务表达发送请求。
XuQiuChaXun() 过程获取需求信息。该方法中调用业务表达类clsYeWuDaiBiao类的需求查询过程XuQiuChaXun()
 
接着在方法中调用业务表达类clsYeWuDaiBiao类的FaSongQingQiuHuoDeShuJu() 过程
 
a. 方法中用到的变量的定义
 
b. 根据参数线构造ServiceAgentContext对象和ReferenceDataDefinition对象,
 
c. 然后调用OfflineBlockBuilder.DataLoaderManager.LoadData()方法发送请求。
 

业务代表实现的请求的回调事件(参考MOAB初始化的注册事件获得详细信息)。
a. 回调业务代表类clsYeWuDaiBiao类
当执行完成查询得到响应后,smart_client 根据请求中参数回调clsYeWuDaiBiao类的XuQiuChaXunFanHui() 过程
 
在XuQiuChaXunFanHui()过程中根据初始化时注册的事件将返回数据的处理转移到clsXuQiuChaXunKongZhi类中进行处理。

XuQiuChaXunFanHui类中注册的事件处理过程是XuQiuChaXunFanHui()过程

b. 回调 需求查询控制类clsXuQiuChaXunKongZhi
 
XuQiuChaXunFanHui()处理过程:
 调用数据处理类中clsShuJuGuanLi.ShuJuGengXin()过程:
 
首先从ReferenceDataCache 中获得请求返回的数据集
DataSet xianShuJu = lixianKongZhi.ReferenceDataCache.Retrieve(ShuJuJian) as DataSet; 

 
然后判断数据如果与本地数据不同则将该数据集保存到本内存缓存中,并且保存到本地文件中。CunRuShuJu()过程是将数据保存到本

地的XML文件。

 
给系统中需求变化变量赋值。该变量将在调用过程XuQiuChaXunFanHui()中使用。

 完成本地缓存数据的更新后在XuQiuChaXunFanHui()过程中继续执行下面语句
 
当数据发生更新,系统重新绑定主界面表格控件的数据源,刷新主界面表格中的数据。
获取基本信息和配置信息
获得基本信息和获得配置信息的过程同获取需求信息数据的过程,只是在调用业务代表类clsYeWuDaiBiao中的

FaSongQingQiuHuoDeShuJu()过程入口参数不同。
a. 获取基本信息
 
b. 获取配置信息
 
本地数据管理机制
由于在关机或断电时,MOAB中缓存中的数据会丢失,为此本系统特意设计了本地文件保存机制和请求重发机制。在向MOAB更新或同步

数据时,会将这些数据保存本地文件中。在离线状态并已向MOAB提交更新数据请求的情况下关机(或断电)。当重新启动系统后,系统

在启动过程会先将本地文件中未收到提交返回信息的数据重新提交到MOAB的队列,从而使系统状态恢复到系统退出前的运行状态。

抱歉!评论已关闭.