private void Consume() { Log.Info(Tag, "Consumer started [" + Thread.CurrentThread.ManagedThreadId + "]"); while (Interlocked.CompareExchange(ref _disposed, 0, 0) == 0) { try { var header = _serialiser.Deserialize <Header>(_networkStream); Log.Debug(Tag, "Received header [name=" + (header.Name ?? "<null>") + " type=" + (header.Type ?? "<null>") + " topic=" + (header.Topic ?? "<null>") + "]"); // Beat-shake if (header.Type == typeof(Beat).FullName) { var beat = _serialiser.Deserialize <Beat>(_networkStream); _serialiser.Serialise(_networkStream, beat); Log.Debug(Tag, "Heartbeat from publisher"); Interlocked.Increment(ref _beat); continue; } var message = _serialiser.Deserialize(_networkStream, _type); Log.Debug(Tag, "Received message."); Interlocked.Increment(ref _messageCount); _action(message); } catch (SocketException e) { Log.Debug(Tag, "Consume: SocketException: " + e.Message + " [SocketErrorCode:" + e.SocketErrorCode + "]"); break; } catch (IOException e) { Log.Debug(Tag, "Consume: IOException: " + e.Message); break; } catch (ProtoSerialiserException) { Log.Error(Tag, "Consume: ProtoSerialiserException"); break; } catch (ObjectDisposedException) { Log.Debug(Tag, "Connect: ObjectDisposedException"); break; } } Dispose(); Log.Info(Tag, "Consumer exiting [" + Thread.CurrentThread.ManagedThreadId + "]"); }
internal static SubscriberClient Connect(IPEndPoint endPoint, string name, string topic, Type type, Action <object> action, Action <IPEndPoint> disconnected) { Log.Debug(Tag, "Connecting to " + endPoint); try { var serialiser = new ProtoSerialiser(); var tcpClient = new TcpClient { NoDelay = true, LingerState = { Enabled = true, LingerTime = 0 } }; tcpClient.Connect(endPoint); var networkStream = tcpClient.GetStream(); // handshake serialiser.Serialise(networkStream, new Header { Topic = topic, Type = type.FullName, Name = name }); var ack = serialiser.Deserialize <string>(networkStream); if (ack != "OK") { return(null); } Log.Debug(Tag, "Subscribing started."); return(new SubscriberClient(endPoint, type, action, disconnected, tcpClient, networkStream, serialiser)); } catch (InvalidOperationException) { Log.Debug(Tag, "Connect: InvalidOperationException"); } catch (SocketException e) { Log.Debug(Tag, "Connect: SocketException: " + e.Message + " [SocketErrorCode:" + e.SocketErrorCode + "]"); } catch (ProtoSerialiserException) { Log.Error(Tag, "Connect: ProtoSerialiserException"); } catch (IOException e) { Log.Debug(Tag, "Connect: IOException: " + e.Message); } Log.Debug(Tag, "Error connecting to " + endPoint); return(null); }
private void Consumer() { Log.Info(Tag, "Starting client consumer [" + Thread.CurrentThread.ManagedThreadId + "]"); CancellationToken token = _cancellation.Token; while (true) { try { ObjectWrap take = _q.Take(token); Log.Debug(Tag, "Got message to send over wire."); var header = new Header { Type = take.Type.FullName, Topic = take.Topic }; _serialiser.Serialise(_networkStream, header); // Beat-shake if (take.Type == typeof(Beat)) { Interlocked.Increment(ref _beatCount); Log.Debug(Tag, "Heartbeat from subscriber " + (Name ?? "<null>")); var beatOut = (Beat)take.Object; _serialiser.Serialise(_networkStream, beatOut); var beatIn = _serialiser.Deserialize <Beat>(_networkStream); Log.Debug(Tag, "Heartbeat # " + (Name ?? "<null>") + " - " + beatIn.Number + " - " + beatOut.Number); if (beatIn.Number != beatOut.Number) { Log.Info(Tag, "Failed heartbeat from subscriber " + (Name ?? "<null>") + " - " + beatIn.Number + " - " + beatOut.Number); break; } continue; } _serialiser.Serialise(_networkStream, take.Type, take.Object); } catch (InvalidOperationException) { Log.Debug(Tag, "Consumer: InvalidOperationException"); break; } catch (OperationCanceledException) { Log.Debug(Tag, "Consumer: OperationCanceledException"); break; } catch (IOException e) { Log.Debug(Tag, "Consumer: IOException: " + e.Message); break; } catch (ProtoSerialiserException) { Log.Debug(Tag, "Consumer: ProtoSerialiserException"); break; } } InternalClose(); Log.Info(Tag, "Exiting client consumer [" + Thread.CurrentThread.ManagedThreadId + "]"); }