private bool buildBackups() { try { backupMutex.WaitOne(); if (!disposed && Backup && backups.Count < BackupPoolSize) { List <Uri> connectList = ConnectList; foreach (BackupTransport bt in backups) { if (bt.Disposed) { backups.Remove(bt); } } foreach (Uri uri in connectList) { if (ConnectedTransportURI != null && !ConnectedTransportURI.Equals(uri)) { try { BackupTransport bt = new BackupTransport(this); bt.Uri = uri; if (!backups.Contains(bt)) { ITransport t = TransportFactory.CompositeConnect(uri); t.Command = new CommandHandler(bt.onCommand); t.Exception = new ExceptionHandler(bt.onException); t.Start(); bt.Transport = t; backups.Add(bt); } } catch (Exception e) { Tracer.DebugFormat("Failed to build backup: {0}", e.Message); } } if (backups.Count < BackupPoolSize) { break; } } } } finally { backupMutex.ReleaseMutex(); } return(false); }
private bool BuildBackups() { lock (backupMutex) { if (!disposed && Backup && backups.Count < BackupPoolSize) { List <Uri> connectList = ConnectList; foreach (BackupTransport bt in backups) { if (bt.Disposed) { backups.Remove(bt); } } foreach (Uri uri in connectList) { if (ConnectedTransportURI != null && !ConnectedTransportURI.Equals(uri)) { try { BackupTransport bt = new BackupTransport(this) { Uri = uri }; if (!backups.Contains(bt)) { ITransport t = TransportFactory.CompositeConnect(uri); t.Command = bt.OnCommand; t.Exception = bt.OnException; t.Start(); bt.Transport = t; backups.Add(bt); } } catch (Exception e) { Tracer.DebugFormat("Failed to build backup: {0}", e.Message); } } if (backups.Count == BackupPoolSize) { break; } } } } return(false); }
public override String ToString() { return(ConnectedTransportURI == null ? "unconnected" : ConnectedTransportURI.ToString()); }
public void HandleTransportFailure(Exception e) { ITransport transport = connectedTransport.GetAndSet(null); if (transport != null) { transport.Command = new CommandHandler(disposedOnCommand); transport.Exception = new ExceptionHandler(disposedOnException); try { transport.Stop(); } catch (Exception ex) { ex.GetType(); // Ignore errors but this lets us see the error during debugging } lock (reconnectMutex) { bool reconnectOk = false; if (started) { Tracer.WarnFormat("Transport failed to {0}, attempting to automatically reconnect due to: {1}", ConnectedTransportURI.ToString(), e.Message); reconnectOk = true; } failedConnectTransportURI = ConnectedTransportURI; ConnectedTransportURI = null; connected = false; if (reconnectOk) { reconnectTask.Wakeup(); } } if (this.Interrupted != null) { this.Interrupted(transport); } } }