private void SetQosAndCreateConsumers() { if (!AcknowledgeMode.IsAutoAck() && !Cancelled) { // Set basicQos before calling basicConsume (otherwise if we are not acking the broker // will send blocks of 100 messages) try { Channel.BasicQos(0, PrefetchCount, true); } catch (Exception e) { ActiveObjectCounter.Release(this); throw new RabbitIOException(e); } } try { if (!Cancelled) { foreach (var queueName in Queues) { if (!MissingQueues.Contains(queueName)) { ConsumeFromQueue(queueName); } } } } catch (Exception e) { throw RabbitExceptionTranslator.ConvertRabbitAccessException(e); } }
public BlockingQueueConsumer( IConnectionFactory connectionFactory, IMessageHeadersConverter messagePropertiesConverter, ActiveObjectCounter <BlockingQueueConsumer> activeObjectCounter, AcknowledgeMode acknowledgeMode, bool transactional, ushort prefetchCount, ILoggerFactory loggerFactory, params string[] queues) : this(connectionFactory, messagePropertiesConverter, activeObjectCounter, acknowledgeMode, transactional, prefetchCount, true, loggerFactory, queues) { }
public BlockingQueueConsumer( IConnectionFactory connectionFactory, IMessageHeadersConverter messagePropertiesConverter, ActiveObjectCounter <BlockingQueueConsumer> activeObjectCounter, AcknowledgeMode acknowledgeMode, bool transactional, ushort prefetchCount, bool defaultRequeueRejected, Dictionary <string, object> consumerArgs, ILoggerFactory loggerFactory, params string[] queues) : this(connectionFactory, messagePropertiesConverter, activeObjectCounter, acknowledgeMode, transactional, prefetchCount, defaultRequeueRejected, consumerArgs, false, loggerFactory, queues) { }
public void Start() { Logger?.LogDebug("Starting consumer {consumer}", ToString()); try { ResourceHolder = ConnectionFactoryUtils.GetTransactionalResourceHolder(ConnectionFactory, Transactional); Channel = ResourceHolder.GetChannel(); // ClosingRecoveryListener.AddRecoveryListenerIfNecessary(Channel); } catch (RabbitAuthenticationException e) { throw new FatalListenerStartupException("Authentication failure", e); } DeliveryTags.Clear(); ActiveObjectCounter.Add(this); PassiveDeclarations(); SetQosAndCreateConsumers(); }
public BlockingQueueConsumer( IConnectionFactory connectionFactory, IMessageHeadersConverter messagePropertiesConverter, ActiveObjectCounter <BlockingQueueConsumer> activeObjectCounter, AcknowledgeMode acknowledgeMode, bool transactional, ushort prefetchCount, bool defaultRequeueRejected, Dictionary <string, object> consumerArgs, bool noLocal, bool exclusive, ILoggerFactory loggerFactory, params string[] queues) { ConnectionFactory = connectionFactory; MessageHeadersConverter = messagePropertiesConverter; ActiveObjectCounter = activeObjectCounter; AcknowledgeMode = acknowledgeMode; Transactional = transactional; PrefetchCount = prefetchCount; DefaultRequeueRejected = defaultRequeueRejected; if (consumerArgs != null && consumerArgs.Count > 0) { foreach (var arg in consumerArgs) { ConsumerArgs.Add(arg.Key, arg.Value); } } NoLocal = noLocal; Exclusive = exclusive; Queues = queues.ToList(); Queue = new BlockingCollection <Delivery>(prefetchCount); LoggerFactory = loggerFactory; Logger = loggerFactory?.CreateLogger <BlockingQueueConsumer>(); }
private void HandleDeclarationException(int passiveDeclareRetries, DeclarationException e) { if (passiveDeclareRetries > 0 && Channel.IsOpen) { Logger?.LogWarning(e, "Queue declaration failed; retries left={retries}", passiveDeclareRetries); try { Thread.Sleep(FailedDeclarationRetryInterval); } catch (Exception e1) { Declaring = false; ActiveObjectCounter.Release(this); throw RabbitExceptionTranslator.ConvertRabbitAccessException(e1); } } else if (e.FailedQueues.Count < Queues.Count) { Logger?.LogWarning("Not all queues are available; only listening on those that are - configured: {queues}; not available: {notavail}", string.Join(',', Queues), string.Join(',', e.FailedQueues)); lock (MissingQueues) { foreach (var q in e.FailedQueues) { MissingQueues.Add(q); } } LastRetryDeclaration = DateTimeOffset.Now.ToUnixTimeMilliseconds(); } else { Declaring = false; ActiveObjectCounter.Release(this); throw new QueuesNotAvailableException("Cannot prepare queue for listener. Either the queue doesn't exist or the broker will not allow us to use it.", e); } }
/// <summary> /// Initializes a new instance of the <see cref="BlockingQueueConsumer"/> class. Create a consumer. The consumer must not attempt to use the connection factory or communicate with the broker until it is started. /// </summary> /// <param name="connectionFactory"> /// The connection factory. /// </param> /// <param name="activeObjectCounter"> /// The active object counter. /// </param> /// <param name="acknowledgeMode"> /// The acknowledge mode. /// </param> /// <param name="transactional"> /// The transactional. /// </param> /// <param name="prefetchCount"> /// The prefetch count. /// </param> /// <param name="queues"> /// The queues. /// </param> public BlockingQueueConsumer(IConnectionFactory connectionFactory, ActiveObjectCounter<BlockingQueueConsumer> activeObjectCounter, AcknowledgeModeUtils.AcknowledgeMode acknowledgeMode, bool transactional, int prefetchCount, int prefetchSize, params string[] queues) { this.connectionFactory = connectionFactory; this.activeObjectCounter = activeObjectCounter; this.acknowledgeMode = acknowledgeMode; this.transactional = transactional; this.prefetchCount = prefetchCount; this.prefetchSize = prefetchSize; this.queues = queues; }
public void SetUp() { this.counter = new ActiveObjectCounter<object>(); }
public void SetUp() { this.counter = new ActiveObjectCounter <object>(); }
/// <summary>Initializes a new instance of the <see cref="BlockingQueueConsumer"/> class. Create a consumer. The consumer must not attempt to use the connection factory or communicate with the broker until it is started.</summary> /// <param name="connectionFactory">The connection factory.</param> /// <param name="messagePropertiesConverter">The message properties converter.</param> /// <param name="activeObjectCounter">The active object counter.</param> /// <param name="acknowledgeMode">The acknowledge mode.</param> /// <param name="transactional">if set to <c>true</c> [transactional].</param> /// <param name="prefetchCount">The prefetch count.</param> /// <param name="queues">The queues.</param> public BlockingQueueConsumer( IConnectionFactory connectionFactory, IMessagePropertiesConverter messagePropertiesConverter, ActiveObjectCounter<BlockingQueueConsumer> activeObjectCounter, AcknowledgeModeUtils.AcknowledgeMode acknowledgeMode, bool transactional, int prefetchCount, params string[] queues) : this(connectionFactory, messagePropertiesConverter, activeObjectCounter, acknowledgeMode, transactional, prefetchCount, true, queues) { }
/// <summary>Initializes a new instance of the <see cref="BlockingQueueConsumer"/> class. Create a consumer. The consumer must not attempt to use the connection factory or communicate with the broker until it is started.</summary> /// <param name="connectionFactory">The connection factory.</param> /// <param name="messagePropertiesConverter">The message properties converter.</param> /// <param name="activeObjectCounter">The active object counter.</param> /// <param name="acknowledgeMode">The acknowledge mode.</param> /// <param name="transactional">if set to <c>true</c> [transactional].</param> /// <param name="prefetchCount">The prefetch count.</param> /// <param name="defaultRequeueRejected">The default requeue rejected.</param> /// <param name="queues">The queues.</param> public BlockingQueueConsumer( IConnectionFactory connectionFactory, IMessagePropertiesConverter messagePropertiesConverter, ActiveObjectCounter<BlockingQueueConsumer> activeObjectCounter, AcknowledgeModeUtils.AcknowledgeMode acknowledgeMode, bool transactional, int prefetchCount, bool defaultRequeueRejected, params string[] queues) { this.connectionFactory = connectionFactory; this.messagePropertiesConverter = messagePropertiesConverter; this.activeObjectCounter = activeObjectCounter; this.acknowledgeMode = acknowledgeMode; this.transactional = transactional; this.prefetchCount = prefetchCount; this.defaultRequeueRejected = defaultRequeueRejected; this.queues = queues; }