Example #1
0
        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 + "]");
        }
Example #2
0
        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);
        }
Example #3
0
        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 + "]");
        }