用Quickfix详解Fix(八)-消息处理(消息恢复)

消息恢复

所谓消息的恢复,有2种情况

收到的消息序列号大于所期望的序列号

这个表明丢失了一些消息 。则立刻应该发送一个重传消息,并告诉对方应该重新传送消息的开始序列号和结束序列号。并把当前接收到的消息压入待处理消息队列因为Fix 消息必须要求按顺序处理,等所有重传消息重新传过来,并处理后,再处理队列消息。对方收到重传消息后,则应该根据重传开始和结束序列号重新传送,在重新传送所有消息时候,当遇到消息是Admin类型时候(即:logon,HEARTBEAT,TEST_REQUEST,SEQUENCE_RESET,LOGOUT,RESEND_REQUEST,REJECT)则应该忽略,应该立刻发送一个直接重置的消息告诉对方这些消息不需要重发当遇到消息是业务消息时候,则从消息持久库中调出重新发送,并且要在消息中置一个标示,标示这个消息是重发消息。(在发送之前如果用户指定不需要发送,则可以像admin类型一样发送要求对方直接重置,这个Fix 没有明确规定,目前quicfxi具有这个功能)。举个例子说明:

比如 A 收到 B 发送过来的一个消息其序列号为 10 , 但A期望的是3 ,那么1)A会把消息10压入待处理队列,并且A立刻会发送一个要求重新发送消息给B ,并且指定要重发3-92)B收到后重新发送请求后,从消息持久库中找出3-9消息。假如各消息类型如下:3 : 业务消息4-6 :为admin消息7 :业务消息8 :admin消息9 :业务消息则B在重发的时候。对于3,则直接发送。并且要在消息中置一个标示,标示这个消息是重发消息(对于quickfix在发送之前,会调用用户接口,如果用户拒绝重发,则不发,按admin类型处理)对于4-6,不重新发送,但会发送一个要求A直接把期望的消息序列号增加到6对于7,则直接发送。并且要在消息中置一个标示,标示这个消息是重发消息(对于quickfix在发送之前,会调用用户接口,如果用户拒绝重发,则不发,按admin类型处理)对于8。,不重新发送,但会发送一个要求A直接把期望的消息序列号增加到8对于9,则直接发送。并且要在消息中置一个标示,标示这个消息是重发消息(对于quickfix在发送之前,会调用用户接口,如果用户拒绝重发,则不发,按admin类型处理)等A完全收到3-9,并处理完毕后,调出待处理队列消息10进行处理。

收到的消息序列号小于所期望的序列号。则会产生Logout消息,并断开连接,这时对方收到后,要么手动处理,要么自动尝试重新登录连接自动增长序列号,直到和对方望值一样时候,双方建立会话 (注意:一般的FIX引擎在断开的时候,不会增长接收序列号,是为了让对方自动增长序列号,以达到自动重新连接的目的)

  

 

你可能感兴趣的:(Fix协议)