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(); }
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(); }