CERTI之RTIG消息处理模块实现细节的举例说明(一)
2010-12-24 11:10
567 查看
本文将以CERTI中的RTIG对某联邦成员发出的设定其自身的时间管理机制为Regulating类型的请求的处理过程为例,详细说明RTIG的整个处理过程,而对于其他的请求的处理过程则与本例极为相似,不再赘述。
在CERTI中,联邦成员federate与其对应的RTIA一般位于同一主机上,因此federate与RTIA之间一般通过进程间通信进行消息的传递和请求的发出和接收;而RTIA和RTIG一般部署在不同的主机上,它们之间进行消息的传递时,一般通过网络通信实现。因此,CERTI为此专门设计了供RTIA和RTIG之间网络通信使用的消息类NetworkMessage,而NetworkMessage是一个抽象类,它有许多的派生类,每个派生类代表了一种具体类型的消息。
在本文中,RTIA发出的设定其时间管理机制为Regulating的消息类为NM_Set_Time_Regulating,而RTIG接收该消息并将其转入相应的消息处理模块的过程为:
(1)RTIA向RTIG的socketServer的TCP监听端口或者UDP监听端口发送一个类型为NM_Set_Time_Regulating的消息实例;
(2)RITG进程中的myRTIG.execute()线程负责持续监听TCP端口和UDP端口;
(3)当检测到有消息被发送到TCP或者UDP端口时,利用语句link = socketServer.getActiveSocket(&fd)获取接收到消息的socket(也即是语句中的link);
(4)利用processIncomingMessage(link)中的msg = NM_Factory::receive(link)语句,从link这个socket中接收相应的消息,存放在msg中;
(5)利用chooseProcessingMethod(link, msg)中的switch(msg->getMessageType())语句,进入到下列程序段中
case NetworkMessage::SET_TIME_REGULATING:
processSetTimeRegulating(link, static_cast<NM_Set_Time_Regulating*>(msg));
break ;
(6)最终,进入到对NM_Set_Time_Regulating的消息处理模块processSetTimeRegulating()中,从而开始对该消息的处理。
下面就对NM_Set_Time_Regulating的消息处理模块processSetTimeRegulating()的整个处理过程进行分析,它的整个处理过程也是一层一层的调用。它的参数分别为消息接收所用的socket连结link,以及RTIA所发出的消息msg。
进入第一层调用:
void RTIG::processSetTimeRegulating(Socket *link, NM_Set_Time_Regulating *msg)
{
if (msg->isRegulatorOn()){
//在RTIG中,auditServer负责记录RTIG的活动日志,以方便用户查看RITG的所有正在进行的活动和已经发生的活动。
auditServer << "ON at time " << msg->getDate().getTime();
//下面这行代码调用federationList类的成员函数createRegulator,根据RTIA发出的消息msg中所包含的联邦、联邦成员和时间的响应信息,对federationList中的相应联邦进行操作
federations.createRegulator(msg->getFederation(),//获取Federation的句柄
msg->getFederate(),//获取Federate的句柄
msg->getDate());//获取消息发送的时间
// 下面的这段代码则是负责生成RTIG对RTIA的回复消息timeRegulationEnabled(),并调用send函数发送给相应的federate.
NM_Time_Regulation_Enabled rep ;
rep.setFederate(msg->getFederate());//设定回复消息中的Federation的句柄
rep.setFederation(msg->getFederation());//设定回复消息中的Federate的句柄
rep.setDate(msg->getDate());//设定回复消息的时间
rep.send(link,NM_msgBufSend);//调用消息发送函数,NM_msgBufSend为消息发送缓冲池}
}
进入第二层调用:
在上面的federations.createRegulator函数中,关键代码如下:
void
FederationsList::createRegulator(Handle federationHandle,
FederateHandle federate,
FederationTime time)
{
//首先根据传入的参数federationHandle,在federationList中找到对应的联邦的指针
Federation *federation = searchFederation(federationHandle);
//然后再利用该联邦的指针调用federation类的成员函数addRegulator
federation->addRegulator(federate, time);
}
进入第三层调用:
void Federation::addRegulator(FederateHandle federate_handle, FederationTime time)
{
// 根据传入的联邦成员句柄得到对应的联邦成员的引用
Federate &federate = getFederate(federate_handle);
// 将该联邦成员加入到Federation中的regulators这个list类中,regulators负责存储一个联邦中所有采用时间调节机制的联邦成员。
regulators.insert(federate_handle, time);
federate.setRegulator(true);
//生成相应的通知消息,该通知消息将被发送给联邦中所有其他联邦成员。
NM_Set_Time_Regulating msg ;
msg.setException(e_NO_EXCEPTION);
msg.setFederation(handle);
msg.setFederate(federate_handle);
msg.regulatorOn();
msg.setDate(time);
//将通知消息广播发送给联邦中的其他联邦成员。
this->broadcastAnyMessage(&msg, 0,false);}
进入第四层调用:
void LBTS::insert(FederateHandle num_fed, FederationTime time)
{
//将该联邦成员加入到Federation中的regulators这个list类中
clocks[num_fed] = time ;
//compute函数将会促使各个联邦成员重新计算并更新自己的LBTS值
compute();
}
综上,我们可以看出,消息处理模块,其实分别是将消息从RTIG传送到FederationList中,再从FederationList中传送到消息对应的Federation中,最后再从Federation中传送到对应的Federate中或者直接调用Federation中的某个成员函数进行处理。
RITG中的其他消息处理模块的实现细节与上述过程基本一样,通过三层调用最终实现对消息的处理和响应。
在CERTI中,联邦成员federate与其对应的RTIA一般位于同一主机上,因此federate与RTIA之间一般通过进程间通信进行消息的传递和请求的发出和接收;而RTIA和RTIG一般部署在不同的主机上,它们之间进行消息的传递时,一般通过网络通信实现。因此,CERTI为此专门设计了供RTIA和RTIG之间网络通信使用的消息类NetworkMessage,而NetworkMessage是一个抽象类,它有许多的派生类,每个派生类代表了一种具体类型的消息。
在本文中,RTIA发出的设定其时间管理机制为Regulating的消息类为NM_Set_Time_Regulating,而RTIG接收该消息并将其转入相应的消息处理模块的过程为:
(1)RTIA向RTIG的socketServer的TCP监听端口或者UDP监听端口发送一个类型为NM_Set_Time_Regulating的消息实例;
(2)RITG进程中的myRTIG.execute()线程负责持续监听TCP端口和UDP端口;
(3)当检测到有消息被发送到TCP或者UDP端口时,利用语句link = socketServer.getActiveSocket(&fd)获取接收到消息的socket(也即是语句中的link);
(4)利用processIncomingMessage(link)中的msg = NM_Factory::receive(link)语句,从link这个socket中接收相应的消息,存放在msg中;
(5)利用chooseProcessingMethod(link, msg)中的switch(msg->getMessageType())语句,进入到下列程序段中
case NetworkMessage::SET_TIME_REGULATING:
processSetTimeRegulating(link, static_cast<NM_Set_Time_Regulating*>(msg));
break ;
(6)最终,进入到对NM_Set_Time_Regulating的消息处理模块processSetTimeRegulating()中,从而开始对该消息的处理。
下面就对NM_Set_Time_Regulating的消息处理模块processSetTimeRegulating()的整个处理过程进行分析,它的整个处理过程也是一层一层的调用。它的参数分别为消息接收所用的socket连结link,以及RTIA所发出的消息msg。
进入第一层调用:
void RTIG::processSetTimeRegulating(Socket *link, NM_Set_Time_Regulating *msg)
{
if (msg->isRegulatorOn()){
//在RTIG中,auditServer负责记录RTIG的活动日志,以方便用户查看RITG的所有正在进行的活动和已经发生的活动。
auditServer << "ON at time " << msg->getDate().getTime();
//下面这行代码调用federationList类的成员函数createRegulator,根据RTIA发出的消息msg中所包含的联邦、联邦成员和时间的响应信息,对federationList中的相应联邦进行操作
federations.createRegulator(msg->getFederation(),//获取Federation的句柄
msg->getFederate(),//获取Federate的句柄
msg->getDate());//获取消息发送的时间
// 下面的这段代码则是负责生成RTIG对RTIA的回复消息timeRegulationEnabled(),并调用send函数发送给相应的federate.
NM_Time_Regulation_Enabled rep ;
rep.setFederate(msg->getFederate());//设定回复消息中的Federation的句柄
rep.setFederation(msg->getFederation());//设定回复消息中的Federate的句柄
rep.setDate(msg->getDate());//设定回复消息的时间
rep.send(link,NM_msgBufSend);//调用消息发送函数,NM_msgBufSend为消息发送缓冲池}
}
进入第二层调用:
在上面的federations.createRegulator函数中,关键代码如下:
void
FederationsList::createRegulator(Handle federationHandle,
FederateHandle federate,
FederationTime time)
{
//首先根据传入的参数federationHandle,在federationList中找到对应的联邦的指针
Federation *federation = searchFederation(federationHandle);
//然后再利用该联邦的指针调用federation类的成员函数addRegulator
federation->addRegulator(federate, time);
}
进入第三层调用:
void Federation::addRegulator(FederateHandle federate_handle, FederationTime time)
{
// 根据传入的联邦成员句柄得到对应的联邦成员的引用
Federate &federate = getFederate(federate_handle);
// 将该联邦成员加入到Federation中的regulators这个list类中,regulators负责存储一个联邦中所有采用时间调节机制的联邦成员。
regulators.insert(federate_handle, time);
federate.setRegulator(true);
//生成相应的通知消息,该通知消息将被发送给联邦中所有其他联邦成员。
NM_Set_Time_Regulating msg ;
msg.setException(e_NO_EXCEPTION);
msg.setFederation(handle);
msg.setFederate(federate_handle);
msg.regulatorOn();
msg.setDate(time);
//将通知消息广播发送给联邦中的其他联邦成员。
this->broadcastAnyMessage(&msg, 0,false);}
进入第四层调用:
void LBTS::insert(FederateHandle num_fed, FederationTime time)
{
//将该联邦成员加入到Federation中的regulators这个list类中
clocks[num_fed] = time ;
//compute函数将会促使各个联邦成员重新计算并更新自己的LBTS值
compute();
}
综上,我们可以看出,消息处理模块,其实分别是将消息从RTIG传送到FederationList中,再从FederationList中传送到消息对应的Federation中,最后再从Federation中传送到对应的Federate中或者直接调用Federation中的某个成员函数进行处理。
RITG中的其他消息处理模块的实现细节与上述过程基本一样,通过三层调用最终实现对消息的处理和响应。
相关文章推荐
- 举例说明常用字符串处理函数
- 关于VC++中,两种自定义消息的发送与接收的方法实现进行说明
- 关于添加修改内容的模块化、对象化处理架构说明,以 bom 模块为例。(编号:20110704A0801)
- 微信开发——微信公众平台实现消息接收以及消息的处理(Java版)
- 浅析Microsoft .net PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)
- 简单举例实现和说明委托
- Android事件处理(按键、触摸屏和滚动球的一些实现细节)
- 下面的程序实现了在利用Handler在新线程当中处理消息的方法
- Java实现Session模块来处理Token
- 解析PHP留言本模块主要功能的函数说明(代码可实现)
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(九) 之 用 Redis 实现用户在线离线状态消息处理(一)
- 实现一个自定义事件处理对象notice,或者称为消息中心对象
- 二次开发Jumpserver,增加权限申请模块实现用户组归属,服务器及组授权,系统用户授权申请处理
- android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)
- JavaEE(5) - JMS实现企业Pub-Sub消息处理
- 举例说明android中实现发送邮件的方法
- 举例说明常用字符串处理函数
- 网络编程(53)—— Windows下使用WSAAsyncSelect实现窗口处理socket消息
- 关于UDP消息服务抛出“远程主机强迫关闭了一个现有的连接”的异常说明及处理方法
- Spring有几种事务处理方式?举例说明