/// <summary> /// Constructor. /// </summary> /// <param name="producer">the producer in charge of redirecting erroneous objects.</param> /// <param name="listener">the listener to decorate.</param> /// <param name="errorTopic">the error topic used.</param> /// <exception cref="ArgumentNullException">if any of the method parameters is <code>null</code>.</exception> public GojulMQFailedMessageListener(IGojulMQMessageProducer <T> producer, GojulMQMessageListener <T> listener, string errorTopic) { Condition.Requires(producer).IsNotNull(); Condition.Requires(listener).IsNotNull(); Condition.Requires(errorTopic).IsNotNullOrWhiteSpace(); this._producer = producer; this._listener = listener; this._errorTopic = errorTopic; }
/// <see cref="IGojulMQMessageConsumer{T}.ConsumeMessages(string, OnMessage{T}, CancellationToken)"/> public void ConsumeMessages(string topic, GojulMQMessageListener <T> messageListener, CancellationToken cancellationToken) { Condition.Requires(topic, "topic").IsNotNull().IsNotEmpty(); Condition.Requires(messageListener, "messageListener").IsNotNull(); // CancellationToken cannot be null as it is a struct. _consumer.Subscribe(topic); try { while (!cancellationToken.IsCancellationRequested) { int count = 0; var msg = _consumer.Consume(cancellationToken); while (!cancellationToken.IsCancellationRequested) { // We try to commit on every 100 messages, or when // the cancellation token has been triggered. if (msg != null) { messageListener(msg.Value); count++; if (count % 100 == 0) { _consumer.Commit(); count = 0; } } msg = _consumer.Consume(cancellationToken); } if (count > 0) { _consumer.Commit(); } } } catch (KafkaException e) { _log.Fatal(e, string.Format("A fatal error occured : {0} - aborting the consumer", e.Message)); throw new GojulMQException("Kafka error encountered", e); } cancellationToken.ThrowIfCancellationRequested(); }