예제 #1
0
        public void Connect(RedFoxEndpoint endpoint, ISocketConfiguration socketConfiguration)
        {
            if (socketConfiguration == null)
            {
                throw new ArgumentNullException("socketConfiguration");
            }
            if (_socket != null)
            {
                throw new InvalidOperationException("Subscriber already connected");
            }
            _cts = new CancellationTokenSource();

            _socket = SocketFactory.CreateAndConnectAsync(endpoint, NodeType.Subscriber, socketConfiguration);
            _socket.Disconnected += SocketDisconnected;

            NodeGreetingMessageVerifier.SendReceiveAndVerify(_socket, socketConfiguration.ConnectTimeout);

            if (!_cts.IsCancellationRequested)
            {
                _messageFrameWriter = MessageFrameWriterFactory.CreateWriterFromSocket(_socket);

                _messageReceiveLoop = new MessageReceiveLoop(_messageSerialization, _socket, OnMessageReceived, MessageReceiveLoopOnException);
                _messageReceiveLoop.Start();
            }
        }
예제 #2
0
        internal bool SendMultipleFromQueue(IMessageFrameWriter writer)
        {
            List <MessageFrame> batch;

            if (!_batchMessageFrames.TryTake(out batch))
            {
                batch = new List <MessageFrame>();
            }
            else
            {
                MessageCounterSignal.Add(-batch.Count);
            }

            MessageFrame messageFrame;

            if (_singleMessageFrames.TryTake(out messageFrame))
            {
                MessageCounterSignal.Decrement();

                var batchSize = batch.Sum(x => x.RawMessage.LongLength);
                batch.Add(messageFrame);
                batchSize += messageFrame.RawMessage.LongLength;

                while (batchSize < _sendBufferSize && _singleMessageFrames.TryTake(out messageFrame))
                {
                    batch.Add(messageFrame);
                    batchSize += messageFrame.RawMessage.LongLength;
                }
            }

            writer.WriteMessageFrames(batch);
            return(true);
        }
예제 #3
0
        internal async Task <bool> SendFromQueueAsync(IMessageFrameWriter writer, CancellationToken cancellationToken)
        {
            MessageFrame messageFrame;

            if (_resentMessageFramesCount > 0 && _resentMessageFrames.TryTake(out messageFrame))
            {
                Interlocked.Decrement(ref _resentMessageFramesCount);

                await SendMessageFrameAsync(writer, messageFrame, cancellationToken);

                MessageCounterSignal.Decrement();

                return(true);
            }

            if (!_singleMessageFrames.TryTake(out messageFrame))
            {
                return(false);
            }

            await SendMessageFrameAsync(writer, messageFrame, cancellationToken);

            MessageCounterSignal.Decrement();

            return(true);
        }
예제 #4
0
        internal bool SendMultipleFromQueue(IMessageFrameWriter writer)
        {
            List<MessageFrame> batch;
            if (!_batchMessageFrames.TryTake(out batch))
            {
                batch = new List<MessageFrame>();
            }
            else MessageCounterSignal.Add(-batch.Count);

            MessageFrame messageFrame;
            if (_singleMessageFrames.TryTake(out messageFrame))
            {
                MessageCounterSignal.Decrement();

                var batchSize = batch.Sum(x => x.RawMessage.LongLength);
                batch.Add(messageFrame);
                batchSize += messageFrame.RawMessage.LongLength;

                while (batchSize < _sendBufferSize && _singleMessageFrames.TryTake(out messageFrame))
                {
                    batch.Add(messageFrame);
                    batchSize += messageFrame.RawMessage.LongLength;
                }
            }

            writer.WriteMessageFrames(batch);
            return true;
        }
예제 #5
0
        internal async Task <bool> SendMultipleFromQueueAsync(IMessageFrameWriter writer, CancellationToken cancellationToken)
        {
            List <MessageFrame> batch;

            if (!_batchMessageFrames.TryTake(out batch))
            {
                batch = new List <MessageFrame>();
            }
            else
            {
                MessageCounterSignal.Add(-batch.Count);
            }

            MessageFrame messageFrame;

            if (_singleMessageFrames.TryTake(out messageFrame))
            {
                MessageCounterSignal.Decrement();

                var batchSize = batch.Sum(x => x.RawMessage.LongLength);
                batch.Add(messageFrame);
                batchSize += messageFrame.RawMessage.LongLength;

                while (batchSize < _sendBufferSize && _singleMessageFrames.TryTake(out messageFrame))
                {
                    batch.Add(messageFrame);
                    batchSize += messageFrame.RawMessage.LongLength;
                }
            }

            await writer.WriteMessageFramesAsync(batch, cancellationToken);

            return(true);
        }
        public void Register(MessageQueueBatch messageQueue, IMessageFrameWriter messageFrameWriter)
        {
            if (messageQueue == null) throw new ArgumentNullException("messageQueue");
            if (messageFrameWriter == null) throw new ArgumentNullException("messageFrameWriter");

            var messageQueuePayload = new MessageQueuePayload(messageFrameWriter);
            messageQueue.MessageFramesAdded += MessageQueueOnMessageFramesAdded;
            _messageQueues[messageQueue] = messageQueuePayload;
            StartAsyncProcessingIfNotStartedYet();
        }
        public void Register(IMessageFrameWriter messageFrameWriter)
        {
            if (messageFrameWriter == null) throw new ArgumentNullException("messageFrameWriter");

            var messageQueuePayload = new MessageFrameWriterPayload(messageFrameWriter);
            if (_messageFrameWriters.TryAdd(messageFrameWriter, messageQueuePayload))
            {
                _messageWritersQueueForRoundRobin.Enqueue(messageQueuePayload);
            }

            StartAsyncProcessingIfNotStartedYet();
        }
예제 #8
0
 private void SendMessageFrame(IMessageFrameWriter writer, MessageFrame messageFrame)
 {
     try
     {
         writer.WriteMessageFrame(messageFrame);
     }
     catch
     {
         if (_resentMessageFrames.TryAdd(messageFrame))
         {
             Interlocked.Increment(ref _resentMessageFramesCount);
         }
         throw;
     }
 }
예제 #9
0
 private async Task SendMessageFrameAsync(IMessageFrameWriter writer, MessageFrame messageFrame, CancellationToken cancellationToken)
 {
     try
     {
         await writer.WriteMessageFrameAsync(messageFrame, cancellationToken);
     }
     catch
     {
         if (_resentMessageFrames.TryAdd(messageFrame))
         {
             Interlocked.Increment(ref _resentMessageFramesCount);
         }
         throw;
     }
 }
예제 #10
0
 private void SendMessageFrame(IMessageFrameWriter writer, MessageFrame messageFrame)
 {
     try
     {
         writer.WriteMessageFrame(messageFrame);
     }
     catch
     {
         if (_resentMessageFrames.TryAdd(messageFrame))
         {
             Interlocked.Increment(ref _resentMessageFramesCount);
         }
         throw;
     }
 }
        public void Register(IMessageFrameWriter messageFrameWriter)
        {
            if (messageFrameWriter == null)
            {
                throw new ArgumentNullException("messageFrameWriter");
            }

            var messageQueuePayload = new MessageFrameWriterPayload(messageFrameWriter);

            if (_messageFrameWriters.TryAdd(messageFrameWriter, messageQueuePayload))
            {
                _messageWritersQueueForRoundRobin.Enqueue(messageQueuePayload);
            }

            StartAsyncProcessingIfNotStartedYet();
        }
        public void Register(MessageQueueBatch messageQueue, IMessageFrameWriter messageFrameWriter)
        {
            if (messageQueue == null)
            {
                throw new ArgumentNullException("messageQueue");
            }
            if (messageFrameWriter == null)
            {
                throw new ArgumentNullException("messageFrameWriter");
            }

            var messageQueuePayload = new MessageQueuePayload(messageFrameWriter);

            messageQueue.MessageFramesAdded += MessageQueueOnMessageFramesAdded;
            _messageQueues[messageQueue]     = messageQueuePayload;
            StartAsyncProcessingIfNotStartedYet();
        }
        public bool Unregister(IMessageFrameWriter messageFrameWriter)
        {
            if (messageFrameWriter == null) throw new ArgumentNullException("messageFrameWriter");

            MessageFrameWriterPayload messageFrameWriterPayload;
            var removed = _messageFrameWriters.TryRemove(messageFrameWriter, out messageFrameWriterPayload);
            if (removed)
            {
                messageFrameWriterPayload.Cancelled.Set(true);
            }

            if (_messageFrameWriters.IsEmpty)
            {
                StopProcessing();
            }

            return removed;
        }
예제 #14
0
        internal bool SendFromQueue(IMessageFrameWriter writer)
        {
            MessageFrame messageFrame;

            if (_resentMessageFramesCount > 0 && _resentMessageFrames.TryTake(out messageFrame))
            {
                Interlocked.Decrement(ref _resentMessageFramesCount);
                
                SendMessageFrame(writer, messageFrame);
                MessageCounterSignal.Decrement();

                return true;
            }

            if (!_singleMessageFrames.TryTake(out messageFrame)) return false;

            SendMessageFrame(writer, messageFrame);
            MessageCounterSignal.Decrement();

            return true;
        }
        public bool Unregister(IMessageFrameWriter messageFrameWriter)
        {
            if (messageFrameWriter == null)
            {
                throw new ArgumentNullException("messageFrameWriter");
            }

            MessageFrameWriterPayload messageFrameWriterPayload;
            var removed = _messageFrameWriters.TryRemove(messageFrameWriter, out messageFrameWriterPayload);

            if (removed)
            {
                messageFrameWriterPayload.Cancelled.Set(true);
            }

            if (_messageFrameWriters.IsEmpty)
            {
                StopProcessing();
            }

            return(removed);
        }
예제 #16
0
        internal bool SendFromQueue(IMessageFrameWriter writer)
        {
            MessageFrame messageFrame;

            if (_resentMessageFramesCount > 0 && _resentMessageFrames.TryTake(out messageFrame))
            {
                Interlocked.Decrement(ref _resentMessageFramesCount);

                SendMessageFrame(writer, messageFrame);
                MessageCounterSignal.Decrement();

                return(true);
            }

            if (!_singleMessageFrames.TryTake(out messageFrame))
            {
                return(false);
            }

            SendMessageFrame(writer, messageFrame);
            MessageCounterSignal.Decrement();

            return(true);
        }
예제 #17
0
 public SenderReceiver(IMessageFrameWriter sender, MessageFrameReceiver receiver)
 {
     Sender = sender;
     Receiver = receiver;
 }
예제 #18
0
        internal async Task<bool> SendMultipleFromQueueAsync(IMessageFrameWriter writer, CancellationToken cancellationToken)
        {
            List<MessageFrame> batch;
            if (!_batchMessageFrames.TryTake(out batch))
            {
                batch = new List<MessageFrame>();
            }
            else MessageCounterSignal.Add(-batch.Count);

            MessageFrame messageFrame;
            if (_singleMessageFrames.TryTake(out messageFrame))
            {
                MessageCounterSignal.Decrement();

                var batchSize = batch.Sum(x => x.RawMessage.LongLength);
                batch.Add(messageFrame);
                batchSize += messageFrame.RawMessage.LongLength;

                while (batchSize < _sendBufferSize && _singleMessageFrames.TryTake(out messageFrame))
                {
                    batch.Add(messageFrame);
                    batchSize += messageFrame.RawMessage.LongLength;
                }
            }

            await writer.WriteMessageFramesAsync(batch, cancellationToken);
            return true;
        }
예제 #19
0
        internal async Task<bool> SendFromQueueAsync(IMessageFrameWriter writer, CancellationToken cancellationToken)
        {
            MessageFrame messageFrame;

            if (_resentMessageFramesCount > 0 && _resentMessageFrames.TryTake(out messageFrame))
            {
                Interlocked.Decrement(ref _resentMessageFramesCount);
                
                await SendMessageFrameAsync(writer, messageFrame, cancellationToken);
                MessageCounterSignal.Decrement();

                return true;
            }

            if (!_singleMessageFrames.TryTake(out messageFrame)) return false;

            await SendMessageFrameAsync(writer, messageFrame, cancellationToken);
            MessageCounterSignal.Decrement();

            return true;
        }
 public MessageQueuePayload(IMessageFrameWriter writer)
 {
     Writer    = writer;
     Busy      = new InterlockedBoolean();
     Cancelled = new InterlockedBoolean();
 }
예제 #21
0
        public void Connect(RedFoxEndpoint endpoint, ISocketConfiguration socketConfiguration)
        {
            if (socketConfiguration == null) throw new ArgumentNullException("socketConfiguration");
            if (_socket != null) throw new InvalidOperationException("Subscriber already connected");
            _cts = new CancellationTokenSource();

            _socket = SocketFactory.CreateAndConnectAsync(endpoint, NodeType.ServiceQueueWriter, socketConfiguration);
            _socket.Disconnected += SocketDisconnected;

            NodeGreetingMessageVerifier.SendReceiveAndVerify(_socket, socketConfiguration.ConnectTimeout);

            if (!_cts.IsCancellationRequested)
            {
                _messageFrameWriter = MessageFrameWriterFactory.CreateWriterFromSocket(_socket);
            }
        }
 public MessageQueuePayload(IMessageFrameWriter writer)
 {
     Writer = writer;
     Busy = new InterlockedBoolean();
     Cancelled = new InterlockedBoolean();
 }
예제 #23
0
 public SenderReceiver(IMessageFrameWriter sender, MessageFrameReceiver receiver)
 {
     Sender   = sender;
     Receiver = receiver;
 }
예제 #24
0
 private async Task SendMessageFrameAsync(IMessageFrameWriter writer, MessageFrame messageFrame, CancellationToken cancellationToken)
 {
     try
     {
         await writer.WriteMessageFrameAsync(messageFrame, cancellationToken);
     }
     catch
     {
         if (_resentMessageFrames.TryAdd(messageFrame))
         {
             Interlocked.Increment(ref _resentMessageFramesCount);
         }
         throw;
     }
 }