/// <summary>
        /// This method evaluates ACK/Reject messages from remote application for a data transfer message.
        /// </summary>
        /// <param name="communicator">Communicator that sent message</param>
        /// <param name="operationResultMessage">Response message</param>
        /// <param name="waitingMessage">Waiting message for this response (may be null, if it is null, it is searched in _waitingMessages list)</param>
        private void EvaluateResponse(ICommunicator communicator, MDSOperationResultMessage operationResultMessage, WaitingMessage waitingMessage)
        {
            lock (_waitingMessages)
            {
                //If waitingMessage argument is not supplied, find waiting message from _waitingMessages list
                if (waitingMessage == null)
                {
                    foreach (var wMessage in _waitingMessages)
                    {
                        if (wMessage.State == WaitingMessage.WaitingMessageStates.WaitingForAcknowledgment &&
                            wMessage.MessageRecord.MessageId == operationResultMessage.RepliedMessageId)
                        {
                            waitingMessage = wMessage;
                            break;
                        }
                    }

                    //If there is not message that waits for this response, just exit from method..
                    if (waitingMessage == null)
                    {
                        return;
                    }
                }

                //If message is stored to database in this server
                if (waitingMessage.MessageRecord.Id >= 0)
                {
                    if (operationResultMessage.Success)
                    {
                        //If message is persistent (Stored on database), remove from database.
                        if (waitingMessage.MessageRecord.Id > 0)
                        {
                            StorageManager.RemoveMessage(waitingMessage.MessageRecord.Id);
                        }

                        //Remove from list
                        _waitingMessages.Remove(waitingMessage);
                        //Reset _waitingTimeOnError (because this is a success situation)
                        _waitingTimeOnError = FirstWaitingTimeOnError;
                    }
                    else
                    {
                        //Set message state as 'ready to send' again. Thus, message is added to send queue again.
                        waitingMessage.State = WaitingMessage.WaitingMessageStates.ReadyToSend;
                        //Pulse if a thread waiting in ProcessWaitingMessageRecords method
                        Monitor.PulseAll(_waitingMessages);
                    }
                }
                //If message is not stored to database in this server
                else
                {
                    //Remove from list
                    _waitingMessages.Remove(waitingMessage);
                }

                Logger.Debug("EvaluateResponse - WaitingMessages.Count = " + _waitingMessages.Count + ", Application = " + Name);
            }

            //If it is not stored message..
            if (waitingMessage.MessageRecord.Id < 0)
            {
                //Create event to send response message to upper layers
                OnMessageReceived(this, new MessageReceivedFromCommunicatorEventArgs
                                        {
                                            Communicator = communicator,
                                            Message = operationResultMessage
                                        });
            }
        }
 protected virtual void OnResponseReceived(ICommunicator communicator, MDSOperationResultMessage operationResultMessage)
 {
     //No action
 }
 /// <summary>
 /// This method handles ACK/Reject messages from remote application for a data transfer message.
 /// </summary>
 /// <param name="communicator">Communicator that sent message</param>
 /// <param name="operationResultMessage">Response message</param>
 protected override void OnResponseReceived(ICommunicator communicator, MDSOperationResultMessage operationResultMessage)
 {
     base.OnResponseReceived(communicator, operationResultMessage);
     EvaluateResponse(communicator, operationResultMessage, null);
 }