public void MessageReceived(ConsumeResult <TKey, TValue> result) { if (delay > 0) { // this.consumer.Pause(this.consumer.Assignment); // tentativa mal sucessidada de evitar o problema de max.pull.ms que é menor que o tempo da task logger.Log($"Start delay: {delay}ms ({DateTime.Now.ToString("HH:mm:ss")})"); DelayHelper.DelayMessage(result.Timestamp.UnixTimestampMs, delay, cancellationToken); logger.Log($"Stop delay: {delay}ms ({DateTime.Now.ToString("HH:mm:ss")})"); // this.consumer.Resume(this.consumer.Assignment); // tentativa mal sucessidada de evitar o problema de max.pull.ms que é menor que o tempo da task } this.consumerClient.MessageReceived(result); }
public void MessageReceived(ConsumeResult <TKey, TValue> result) { if (delay > 0) { // this.consumer.Pause(this.consumer.Assignment); logger.Log($"Start delay: {delay}ms ({DateTime.Now.ToString("HH:mm:ss")})"); DelayHelper.DelayMessage(result.Timestamp.UnixTimestampMs, delay, cancellationToken); logger.Log($"Stop delay: {delay}ms ({DateTime.Now.ToString("HH:mm:ss")})"); // this.consumer.Resume(this.consumer.Assignment); } this.Resend(result, this.redirectTopic); this.consumerClient?.MessageReceived(result); }
public Task Run(CancellationToken cancellationToken) { var groupId = this.config.GroupId; return(Task.Run(() => { if (cancellationToken != default) { // Garante que ao cancelar a task, ocorra o unsubscribe, do contrário, // o cursor ficará preso na linha "c.Subscribe(...)" e o cancel() só terá efeito após retorno do kafka // que pode demorar minutos até o próximo looping do while. cancellationToken.Register(() => { logger.Log($"Task cancelled (Unsubscribe): Topic: {topicName}, GroupId: {groupId}"); consumer.Unsubscribe(); }); } logger.Log($"Subscribe: Topic: {topicName}, GroupId: {groupId}"); consumer.Subscribe(topicName); // DUVIDA: Tenho duvidas passar o consumer real pro client faz sentido na prática. consumerClient.Subscribed(consumer, cancellationToken); while (!cancellationToken.IsCancellationRequested) { try { var consumed = consumer.Consume(cancellationToken); try { if (CanProcess(consumed, groupId)) { logger.Log($"Event start: {consumerClient.GetType().FullName}"); consumerClient.MessageReceived(consumed); logger.Log($"Event end: {consumerClient.GetType().FullName}"); // DUVIDA: Seria interessante esse código aqui? // if (!config.EnableAutoCommit.Value) // { // consumer.Commit(); // logger.LogDebug($"Message commited: Topic: {cr.Topic}, GroupId: {_groupId}, IsPartitionEOF: {cr.IsPartitionEOF}, Key: {cr.Key}, Offset: {cr.Offset}, Partition: {cr.Partition}, Timestamp: {cr.Timestamp}"); // } } } catch (Exception e) { logger.Log($"Error occured: {e.Message}"); consumerClient.MessageReceivedExceptionOcurred(consumed, e); } } catch (ConsumeException e) { logger.Log($"Error occured: {e.Message}"); consumerClient.ConsumeExceptionOcurred(e); } catch (OperationCanceledException e) { logger.Log($"Error occured: {e.Message}"); consumer.Close(); } } }, cancellationToken)); }