/// <summary>
 /// backup-consider message sending subroutine
 /// not considering posibility of simultaneous
 /// failure of main and backup server (too improbable for this project)
 /// </summary>
 /// <param name="client">cliet</param>
 /// <param name="requests"></param>
 /// <returns></returns>
 public virtual Message[] SendMessages(IClusterClient client, Message[] requests)
 {
     Message[] responses;
     try
     {
         responses = client.SendRequests(requests);
     }
     catch (Exception)
     {
         if (backups != null && backups.Length == 0)
         {
             throw new Exception("Critical client failure. Server timeout" +
                                 " and no backups specified");
         }
         try
         {
             Console.WriteLine("Server not responding. Changing to params {0}, {1}"
                               , backups[0].address, backups[0].port);
             client.ChangeListenerParameters(backups[0].address, backups[0].port);
             currentPort    = backups[0].port;
             currentAddress = backups[0].address;
             Thread.Sleep(5000);
             responses = client.SendRequests(requests);
         }
         catch (Exception)
         {
             throw new Exception("Critical client failure. Server timeout " +
                                 "and primary backup timeout");
         }
     }
     return(responses);
 }
Example #2
0
        /// <summary>
        /// Registers backoup server.
        /// </summary>
        private void RegisterBackupServer()
        {
            var register = new Register()
            {
                Type = new RegisterType()
                {
                    Value         = ComponentType.CommunicationServer,
                    port          = (ushort)Properties.Settings.Default.Port,
                    portSpecified = true
                },
                SolvableProblems    = new[] { "DVRP" },
                ParallelThreads     = 1,
                Deregister          = false,
                DeregisterSpecified = false
            };

            try
            {
                var response = _backupClient.SendRequests(new Message[] { register });
                foreach (var message in response)
                {
                    _messageProcessor.ProcessMessage(message, _problemDataSets, _activeComponents);
                    if (message.MessageType == MessageType.RegisterResponseMessage)
                    {
                        var registerResponse = message.Cast <RegisterResponse>();
                        BackupServerStatusInterval = registerResponse.Timeout;
                        BackupServerId             = registerResponse.Id;
                    }
                    if (message.MessageType == MessageType.NoOperationMessage)
                    {
                        NoOperation nop = message.Cast <NoOperation>();
                        //current positon of backup in hierarchy (1 for first backup, etc...)
                        int pos = nop.BackupServersInfo.Length;
                        _backups = nop.BackupServersInfo.ToList();
                        //if youre not first backup, switch listener params to higher
                        if (pos > 1)
                        {
                            Log.DebugFormat("changing parameters to : {0}, {1}", _backups[pos - 1].address, _backups[pos - 1].port);
                            _backupClient.ChangeListenerParameters
                                (_backups[pos - 2].address, _backups[pos - 2].port);
                        }
                    }
                }
            }
            catch (SocketException) //probably Exception might be written here
            {
                //TODO: Exception caugth. Something went wrong, so we should react here
                //TODO: Default reaction would be critical exit here.
                //TODO: Or maybe make this seerver primary?
                throw;
            }
        }
Example #3
0
 public override Message[] SendMessages(IClusterClient client, Message[] requests)
 {
     client.ChangeListenerParameters(currentAddress, currentPort);
     return(base.SendMessages(client, requests));
 }