/// <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); }
/// <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; } }
public override Message[] SendMessages(IClusterClient client, Message[] requests) { client.ChangeListenerParameters(currentAddress, currentPort); return(base.SendMessages(client, requests)); }