public void Write(T value, int timeoutMillis) { using (TimeoutManager timeout = TimeoutManager.Start(timeoutMillis)) { try { if (!Monitor.TryEnter(_channel, timeout)) { throw new TimeoutException("Timeout locking queue."); } if (Closed) { throw new ChannelClosedException("Impossible to send on a colsed channel."); } IBasicProperties prop = _channel.CreateBasicProperties(); prop.ContentEncoding = "utf-8"; prop.ContentType = "application/json"; prop.Persistent = true; prop.Headers = new Dictionary <string, object>(); prop.Headers.Add(ChannelsRabbitMQManager.Ask().HeadersNameWriterClosed, false); prop.Headers.Add(ChannelsRabbitMQManager.Ask().HeadersNameWriterMessageType, typeof(T).AssemblyQualifiedName); byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)); _channel.BasicPublish(ChannelsRabbitMQManager.Ask().SubscribableChannelCollectorExchange, $"{Name}.{SHA1HashStringForUTF8String(typeof(T).FullName)}", prop, data); } finally { Monitor.Exit(_channel); } } }
public void Dispose() { lock (_channel) { if (!_disposed) { try { _channel.WaitForConfirmsOrDie(TimeSpan.FromMilliseconds(10000)); } catch (Exception e) { _logger.Info(string.Format("Unable to wait borker publish confirms exchange={0}", Name), e); } ChannelsRabbitMQManager.Ask().Connection.ConnectionBlocked -= Connection_ConnectionBlocked; ChannelsRabbitMQManager.Ask().Connection.ConnectionUnblocked -= Connection_ConnectionUnblocked; _channel.Close(200, "Goodbye"); _channel.Dispose(); _disposed = true; } } }
private void _consumer_Received(object sender, BasicDeliverEventArgs result) { lock (_channel) { if (result.BasicProperties.Headers.ContainsKey(ChannelsRabbitMQManager.Ask().HeadersNameWriterMessageType) && Encoding.UTF8.GetString((byte[])result.BasicProperties.Headers[ChannelsRabbitMQManager.Ask().HeadersNameWriterMessageType]) == typeof(T).AssemblyQualifiedName) { if (result.BasicProperties.Headers.ContainsKey(ChannelsRabbitMQManager.Ask().HeadersNameWriterClosed) && (bool)result.BasicProperties.Headers[ChannelsRabbitMQManager.Ask().HeadersNameWriterClosed]) { _drained = true; _channel.BasicAck(result.DeliveryTag, false); } else { _queue = result; } _waitReadable.Set(); Monitor.PulseAll(_channel); } else if (!result.BasicProperties.Headers.ContainsKey(ChannelsRabbitMQManager.Ask().HeadersNameWriterMessageType)) { _logger.Debug("No type header found in message. Trying compatibility."); try { JsonConvert.DeserializeObject <T>(Encoding.UTF8.GetString(result.Body)); if (result.BasicProperties.Headers.ContainsKey(ChannelsRabbitMQManager.Ask().HeadersNameWriterClosed) && (bool)result.BasicProperties.Headers[ChannelsRabbitMQManager.Ask().HeadersNameWriterClosed]) { _drained = true; _channel.BasicAck(result.DeliveryTag, false); } else { _queue = result; } _waitReadable.Set(); Monitor.PulseAll(_channel); } catch (Exception e) { _logger.Debug("Impossible to convert untyped message for readability.Requeuing.", e); _channel.BasicNack(result.DeliveryTag, false, false); } } else { _channel.BasicNack(result.DeliveryTag, false, false); } } }
public SubscribableChannel(string name) { _waitWriteable = new ManualResetEvent(true); Name = name; _channel = ChannelsRabbitMQManager.Ask().Connection.CreateModel(); ChannelsRabbitMQManager.Ask().Connection.ConnectionBlocked += Connection_ConnectionBlocked; ChannelsRabbitMQManager.Ask().Connection.ConnectionUnblocked += Connection_ConnectionUnblocked; _channel.ConfirmSelect(); _channel.BasicQos(0, 1, true); _channel.ExchangeDeclare(ChannelsRabbitMQManager.Ask().SubscribableChannelCollectorExchange, ExchangeType.Topic, true, false, null); }
public SubscriptionReader(string topicName, string queueName) { Name = queueName; _channel = ChannelsRabbitMQManager.Ask().Connection.CreateModel(); _channel.BasicQos(0, 1, true); _channel.ExchangeDeclare(ChannelsRabbitMQManager.Ask().SubscribableChannelCollectorExchange, ExchangeType.Topic, true, false, null); _waitReadable = new ManualResetEvent(false); _channel.QueueDeclare(queueName, true, false, false, null); _channel.QueueBind(queueName, ChannelsRabbitMQManager.Ask().SubscribableChannelCollectorExchange, $"{topicName}.#"); _consumer = new EventingBasicConsumer(_channel); _consumer.Received += _consumer_Received; _channel.BasicConsume(Name, false, _consumer); }
public void Close() { lock (_channel) { _closed = true; IBasicProperties prop = _channel.CreateBasicProperties(); prop.ContentEncoding = "utf-8"; prop.ContentType = "application/json"; prop.Persistent = true; prop.Headers = new Dictionary <string, object>(); prop.Headers.Add(ChannelsRabbitMQManager.Ask().HeadersNameWriterClosed, true); prop.Headers.Add(ChannelsRabbitMQManager.Ask().HeadersNameWriterMessageType, typeof(T).AssemblyQualifiedName); byte[] data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(default(T))); _channel.BasicPublish(ChannelsRabbitMQManager.Ask().SubscribableChannelCollectorExchange, $"{Name}.{SHA1HashStringForUTF8String(typeof(T).FullName)}", prop, data); } }
public void Dispose() { lock (_channel) { if (!_disposed) { try { _channel.WaitForConfirmsOrDie(TimeSpan.FromMilliseconds(10000)); } catch (Exception e) { _logger.Info(string.Format("Unable to wait borker publish confirms exchange={0}", Name), e); } _channel.BasicCancel(_consumer.ConsumerTag); ChannelsRabbitMQManager.Ask().Connection.ConnectionBlocked -= Connection_ConnectionBlocked; ChannelsRabbitMQManager.Ask().Connection.ConnectionUnblocked -= Connection_ConnectionUnblocked; if (Closed && Drained) { uint purgedCount = _channel.QueueDelete(Name); _logger.DebugFormat("Purged messages queue={0}, count={1}", Name, purgedCount); } _channel.Close(200, "Goodbye"); _channel.Dispose(); _queue = null; _waitReadable.Dispose(); _waitWriteable.Dispose(); _disposed = true; } } }
public Channel(string name) { _waitReadable = new ManualResetEvent(false); _waitWriteable = new ManualResetEvent(true); Name = name; _channel = ChannelsRabbitMQManager.Ask().Connection.CreateModel(); ChannelsRabbitMQManager.Ask().Connection.ConnectionBlocked += Connection_ConnectionBlocked; ChannelsRabbitMQManager.Ask().Connection.ConnectionUnblocked += Connection_ConnectionUnblocked; _channel.ConfirmSelect(); _channel.BasicQos(0, 1, true); _channel.ExchangeDeclare(ChannelsRabbitMQManager.Ask().ChannelCollectorExchange, ExchangeType.Topic, true, false, null); _channel.QueueDeclare(name, true, false, false, null); _channel.QueueBind(name, ChannelsRabbitMQManager.Ask().ChannelCollectorExchange, $"{name}.#"); _consumer = new EventingBasicConsumer(_channel); _consumer.Received += _consumer_Received; _channel.BasicConsume(Name, false, _consumer); }