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(); } }
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); }
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); }
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; }
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(); }
private void SendMessageFrame(IMessageFrameWriter writer, MessageFrame messageFrame) { try { writer.WriteMessageFrame(messageFrame); } catch { if (_resentMessageFrames.TryAdd(messageFrame)) { Interlocked.Increment(ref _resentMessageFramesCount); } throw; } }
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; } }
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; }
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); }
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 SenderReceiver(IMessageFrameWriter sender, MessageFrameReceiver receiver) { Sender = sender; Receiver = receiver; }
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; }
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(); }
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); } }