| Quintiq file version 2.0 | 
| #parent: #root | 
| Method ExecuteFirstInboundMessage ( | 
|   DSP_ServiceCommitterBase local_committer | 
| ) as Boolean | 
| { | 
|   Description: | 
|   [* | 
|     Executes a single inbound message and returns true if this was succesful | 
|     When not succesfull kick error processing. | 
|   *] | 
|   TextBody: | 
|   [* | 
|     soft_error := ""; | 
|     can_continue := false; | 
|     dsp := this.DistributedServiceProviderBase(); | 
|     imsg := this.InboundMessageQueue().FirstMessage(); | 
|     is_full_sync_msg := imsg.istype( DSP_FullSyncMessage ); | 
|        | 
|     if ( imsg.StateSeqNr() >=0 and local_committer.StateSeqNr() > imsg.StateSeqNr() )  | 
|     { | 
|       dsp.Log( "Skipping message " + [String]imsg.StateSeqNr() + " while in state " + [String] local_committer.StateSeqNr(), false );  | 
|       imsg.Delete();  | 
|       can_continue := true; | 
|     } | 
|     else if ( imsg.StateSeqNr() >= 0 and local_committer.StateSeqNr() < imsg.StateSeqNr() ) | 
|     { | 
|       dsp.Log( "Missing message for current state " + [String] local_committer.StateSeqNr() + ". First message is for state" + [String]imsg.StateSeqNr() + " --> Requesting sync", false );         | 
|       // We need to update the StateSeqNr here so that the local_committer will eventually | 
|       // has the same StateSeqNr as the master commiter. Otherwise, this will be an endless | 
|       // loop which the process keeps requesting fullsync and master committer keeps sending | 
|       // new StateSeqNr | 
|       local_committer.StateSeqNr( imsg.StateSeqNr() ); | 
|       this.RequestSync( local_committer ); | 
|     } | 
|     else | 
|     { | 
|       if ( not is_full_sync_msg and not imsg.Execute( local_committer, soft_error ) ) | 
|       { | 
|         assert ( soft_error <> "", "Message execution returned false but did not provide error details" ); | 
|         dsp.Log("Soft error '" + soft_error + "' encountered while executing message: " + imsg.GetMessageDescription(), false );       | 
|       } | 
|       else | 
|       { | 
|         if ( is_full_sync_msg and not this.DistributedServiceProviderBase().IsMaster() ) | 
|         { | 
|           dsp.Log( "Full sync message processed --> Requesting sync", false );         | 
|           this.RequestSync( local_committer ); | 
|         } | 
|        | 
|         // Message was processed: | 
|         // 1. Increase state seqnr | 
|         // 2. Broadcast processed master message and discard processed slave messages | 
|         dsp.Log( "Executed message: " + imsg.GetMessageDescription(), true ); | 
|         this.SetInboundMessageProcessed( imsg, local_committer ); | 
|         can_continue := true; | 
|       } | 
|     } | 
|      | 
|     if ( soft_error <> "" ) | 
|     { | 
|       this.ExecuteInboundError( soft_error, true /*is_soft_error*/ ); | 
|     } | 
|      | 
|     return can_continue; | 
|   *] | 
| } |