예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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;
                }
            }
        }
예제 #3
0
            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);
                    }
                }
            }
예제 #4
0
        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);
        }
예제 #5
0
            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);
            }
예제 #6
0
        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);
            }
        }
예제 #7
0
        protected void Application_Start(object sender, EventArgs e)
        {
            _logger = LogManager.GetLogger(GetType());

            using (ILoggingOperation log = _logger.CriticalOperation())
            {
                log.Wrap(() =>
                {
                    ProbeManager.Init();
                    HealthCheckManager.Init();
                    ReportingManager.Init();
                    RemoteReportingManager.Init();
                });

                log.Wrap(() => ChannelsRabbitMQManager.Init());

                log.Wrap(() => Factory   = new StdSchedulerFactory());
                log.Wrap(() => Scheduler = Factory.GetScheduler());

                log.Wrap(() => Scheduler.Start());
            }
        }
예제 #8
0
        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;
                }
            }
        }
예제 #9
0
        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);
        }
예제 #10
0
 public static void Initialize(TestContext ctx)
 {
     ChannelsRabbitMQManager.Init();
 }