Example #1
0
        private void ThreadLoop(IConnectionFactory connectionFactory, bool publisherConfirms)
        {
            var confirmStrategy  = publisherConfirms ? (IConfirmStrategy) new AckNackConfirmStrategy() : new NoConfirmStrategy();
            var connectionHolder = new ConnectionHolder(new[] { connectionFactory }, confirmStrategy);

            foreach (var msg in _queue.GetConsumingEnumerable())
            {
                if (_queue.IsAddingCompleted)
                {
                    msg.Tcs.TrySetException(new RabbitUnackException());
                    continue;
                }
                connectionHolder.Try(ch => {
                    var basicProperties        = ch.CreateBasicProperties();
                    basicProperties.Persistent = true;
                    confirmStrategy.Publishing(ch);
                    ch.BasicPublish(msg.Exchange, msg.RoutingKey, basicProperties, msg.Body);
                    confirmStrategy.Published(msg.Tcs);
                }, ex => {
                    msg.Tcs.TrySetException(ex);
                });
            }

            connectionHolder.Dispose();
            confirmStrategy.Dispose();
        }
Example #2
0
        public RabbitAsyncPublisher(IConnectionFactory connectionFactory, bool publisherConfirms = true)
        {
            _queue            = new BlockingCollection <EnqueuedMessage>();
            _confirmStrategy  = publisherConfirms ? (IConfirmStrategy) new AckNackConfirmStrategy() : new NoConfirmStrategy();
            _connectionHolder = new ConnectionHolder(new[] { connectionFactory }, _confirmStrategy);

            _thread = new Thread(ThreadLoop)
            {
                Name = typeof(RabbitAsyncPublisher).Name
            };
            _thread.Start();
        }