internal Message(Frame frame, NsqTcpConnection connection) { _connection = connection; if (frame.Type != FrameType.Message) { throw new ArgumentException("Frame must have FrameType 'Message'", "frame"); } if (BitConverter.IsLittleEndian) { Array.Reverse(frame.Data, TimestampStart, TimestampCount); Array.Reverse(frame.Data, AttemptsStart, AttemptsCount); } Timestamp = BitConverter.ToInt64(frame.Data, TimestampStart); Attempts = BitConverter.ToInt16(frame.Data, AttemptsStart); Id = Encoding.ASCII.GetString(frame.Data, IdStart, IdCount); // Data var dataLength = frame.Data.Length - DataStart; Body = new byte[dataLength]; Array.ConstrainedCopy(frame.Data, DataStart, Body, 0, dataLength); }
private void LookupTask(object messageHandler) { MessageHandler handler = (MessageHandler)messageHandler; OnInternalMessage("Begin lookup cycle"); int beginningCount, endingCount, added = 0, removed = 0; List <NsqAddress> nsqAddresses; lock (_connections) { var tasks = _lookupServers.Select(server => server.LookupAsync(_options.Topic)).ToList(); var delay = Task.Delay(5000); Task.WhenAny(Task.WhenAll(tasks), delay).Wait(); nsqAddresses = tasks.Where(t => t.Status == TaskStatus.RanToCompletion) .SelectMany(t => t.Result) .Distinct() .ToList(); var servers = nsqAddresses .Select(add => new DnsEndPoint(add.BroadcastAddress, add.TcpPort)) .ToList(); var currentEndPoints = _connections.Keys.ToList(); var newEndPoints = servers.Except(currentEndPoints).ToList(); var removedEndPoints = currentEndPoints.Except(servers).ToList(); foreach (var endPoint in removedEndPoints) { var connection = _connections[endPoint]; _connections.Remove(endPoint); connection.Dispose(); removed++; } foreach (var endPoint in newEndPoints) { if (!_connections.ContainsKey(endPoint)) { var connection = new NsqTcpConnection(endPoint, _options, NoRetryBackoff); connection.InternalMessages += (sender, e) => OnInternalMessage("{0}: {1}", endPoint, e.Message); try { connection.Connect(handler); _connections[endPoint] = connection; added++; } catch (Exception ex) { OnInternalMessage("Connection to endpoint {0} failed: {1}", endPoint, ex.Message); } } } beginningCount = currentEndPoints.Count; endingCount = _connections.Count; SetMaxInFlightWithoutWaitingForInitialConnectionAsync(_maxInFlight).Wait(); } if (_firstDiscoveryCycle) { _firstConnectionTaskCompletionSource.TrySetResult(true); _firstDiscoveryCycle = false; } OnDiscoveryCompleted(nsqAddresses); OnInternalMessage("End lookup cycle. BeginningCount = {0}, EndingCount = {1}, Added = {2}, Removed = {3}", beginningCount, endingCount, added, removed); }