CERTI之RTIG消息处理模块实现细节的举例说明(一)

来源:互联网 发布:三维产品展示软件 编辑:程序博客网 时间:2024/05/20 07:49

本文将以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中的其他消息处理模块的实现细节与上述过程基本一样,通过三层调用最终实现对消息的处理和响应。

原创粉丝点击