예제 #1
0
 /// <inheritdoc />
 public void Dispose()
 {
     // Because the tasks returned from ProduceAsync might not be finished, wait for all messages to be sent
     _producer?.Flush(TimeSpan.FromSeconds(5));
     _producer?.Dispose();
     _queueSubscriptionStorage?.Dispose();
 }
예제 #2
0
 private void CloseProducer()
 {
     if (Producer != null)
     {
         Producer?.Flush(TimeSpan.FromSeconds(60));
         Producer?.Dispose();
     }
     Producer = null;
 }
예제 #3
0
        private void DisposeConfluentProducer()
        {
            // Dispose only if still in cache to avoid ObjectDisposedException
            if (!ProducersCache.TryRemove(Endpoint.Configuration.ConfluentConfig, out _))
            {
                return;
            }

            _confluentProducer?.Flush(TimeSpan.FromSeconds(10));
            _confluentProducer?.Dispose();
            _confluentProducer = null;
        }
예제 #4
0
 private void Stop()
 {
     try
     {
         _producer?.Flush(TimeSpan.FromSeconds(30));
         _producer?.Dispose();
         _producer = null;
     }
     catch (Exception ex)
     {
         ErrorHandler.Error("Error while stopping producer", ex);
     }
 }
예제 #5
0
        public override void PostStop()
        {
            Log.Debug("Stage completed");
            _producer.OnError -= OnProducerError;

            if (_stage.CloseProducerOnStop)
            {
                _producer.Flush(_stage.Settings.FlushTimeout);
                _producer.Dispose();
                Log.Debug($"Producer closed: {_producer.Name}");
            }

            base.PostStop();
        }
예제 #6
0
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            for (int i = 0; i < 100; i++)
            {
                var value = $"Hello world {i}";
                _logger.LogInformation(value);
                await _producer.ProduceAsync(topic : "demo", message : new Message <Null, string>()
                {
                    Value = value
                }, cancellationToken);

                _producer.Flush(timeout: TimeSpan.FromSeconds(10));
            }
        }
예제 #7
0
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            for (var i = 0; i < 100; ++i)
            {
                var value = $"Hello World {i}";
                _logger.LogInformation(value);
                await _producer.ProduceAsync("demo", new Message <Null, string>()
                {
                    Value = value
                }, cancellationToken);
            }

            _producer.Flush(TimeSpan.FromSeconds(10));
        }
예제 #8
0
        private static DeliveryResult <Null, string> ProduceMessage(string topic, IProducer <Null, string> producer, string testString)
        {
            var result = producer.ProduceAsync(topic, new Message <Null, string> {
                Value = testString
            }).Result;

            Assert.NotNull(result?.Message);
            Assert.Equal(topic, result.Topic);
            Assert.NotEqual <long>(result.Offset, Offset.Unset);
            Assert.Equal(TimestampType.CreateTime, result.Message.Timestamp.Type);
            Assert.True(Math.Abs((DateTime.UtcNow - result.Message.Timestamp.UtcDateTime).TotalMinutes) < 1.0);
            Assert.Equal(0, producer.Flush(TimeSpan.FromSeconds(10)));
            return(result);
        }
예제 #9
0
        private DeliveryResult <Null, string> ProduceMessage(string messageString)
        {
            var result =
                producerAsync.ProduceAsync(
                    currentTopic,
                    new Message <Null, string> {
                Value = messageString
            }
                    ).Result;

            producerAsync.Flush(TimeSpan.FromSeconds(10));

            return(result);
        }
예제 #10
0
 public void Flush()
 {
     log.Debug($"{logPrefix}Flusing producer");
     if (producer != null)
     {
         try
         {
             producer.Flush();
         }catch (ObjectDisposedException)
         {
             // has been disposed
         }
     }
 }
예제 #11
0
        public void Dispose()
        {
            if (_isDisposing)
            {
                return;
            }

            _isDisposing = true;

            _logger.LogDebug("Disposing Kafka Producer [{producerName}] ...", _producer.Name);

            _producer.Flush(TimeSpan.FromSeconds(5));
            _producer?.Dispose();
        }
        public async void StartAsync(string guid, string accountId)
        {
            var transaction = new Transaction(guid);
            var valJson     = JsonConvert.SerializeObject(transaction);

            var key            = accountId;
            var topic          = "firstTopic";
            var deliveryResult = await _producer.ProduceAsync(topic, new Message <string, string>
            {
                Value = valJson,
                Key   = key
            });

            _producer.Flush(TimeSpan.FromSeconds(10));
        }
예제 #13
0
        void Dispose()
        {
            _log.Info("Flushing and Disposing Kafka Producer ");

            try
            {
                _producer.Flush(TimeSpan.FromSeconds(10));
                _producer.Dispose();
            }
            catch (Exception e)
            {
                _log.Error("EXCEPTION: Flushing and Disposing Kafka Producer", e);
                throw;
            }
        }
예제 #14
0
        /* public void StartConsumer()
         * {
         *   var conf = new ConsumerConfig
         *   {
         *       GroupId = _grupo,
         *       BootstrapServers = _servidoresMensageria,
         *       AutoOffsetReset = AutoOffsetReset.Earliest
         *   };
         *
         *   _consumer = new ConsumerBuilder<Ignore, string>(conf).Build();
         *   _consumer.Subscribe(_topicos);
         * }*/

        /// <summary>
        /// Para execução
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StopAsync(CancellationToken cancellationToken)
        {
            using (var scope = _services.CreateScope())
            {
                var logger = scope.ServiceProvider.GetRequiredService <ILogger <MensageriaWorker> >();

                logger.LogInformation("PARANDO: Job de Mensageria");

                _timer?.Change(Timeout.Infinite, 0);

                _producer?.Flush();

                return(Task.CompletedTask);
            }
        }
        protected virtual void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            if (disposing)
            {
                Producer?.Flush();
                Producer?.Dispose();
            }

            _disposed = true;
        }
예제 #16
0
        private void CreateProducer()
        {
            if (Interlocked.CompareExchange(ref _created, 1, 0) == 0)
            {
                _producer = new ProducerBuilder <Null, WrapperMessage>(_producerConfig)
                            .SetValueSerializer(new ProducerValueSerializer <WrapperMessage>())
                            .Build();

                _disposable = Disposable.Create(() =>
                {
                    _disposed = true;
                    _producer.Flush();
                    _producer.Dispose();
                });
            }
        }
예제 #17
0
        protected virtual void Dispose(bool disposing)
        {
            if (!_disposedValue)
            {
                if (disposing)
                {
                    if (_producer != null)
                    {
                        _producer.Flush(TimeSpan.FromMilliseconds(_producerConfig.MessageTimeoutMs.Value + 5000));
                        _producer.Dispose();
                        _producer = null;
                    }
                }

                _disposedValue = true;
            }
        }
예제 #18
0
        // DUVIDA: O nome do método é Async dentro de uma classe Sync, talvez juntar esse método no ProducerAsyncSender e renome-lo para
        // ProducerSender com os dois métodos?
        public async Task SendAsync(TKey key, TValue value, string topicName, Headers headers = null, CancellationToken cancellationToken = default)
        {
            var message = new Message <TKey, TValue>
            {
                Key     = key,
                Value   = value,
                Headers = headers
            };

            var produceTask = producer.ProduceAsync(topicName, message);

            producerClient.MessageSent(message);
            producerClient.MessageDelivered(await produceTask);

            // DUVIDA: Faz sentido ter o flush no método asyncrono tb? talvez deixar isso no ProducerSettings.
            producer.Flush(cancellationToken);
            this.logger.Log($"[To queue]: Message delivered: {topicName}, {message.Key}");
        }
예제 #19
0
        public void SendImageRequest(int display_x, int display_y, double min_x, double min_y, double max_x, double max_y, int depth, string connectionId)
        {
            var _request = new avro.imageRequest();

            _request.display_x    = display_x;
            _request.display_y    = display_y;
            _request.min_x        = min_x;
            _request.min_y        = min_y;
            _request.max_x        = max_x;
            _request.max_y        = max_y;
            _request.depth        = depth;
            _request.connectionId = connectionId;

            _producer.ProduceAsync("imageReq", new Message <Null, imageRequest> {
                Value = _request
            });
            _producer.Flush();

            Console.WriteLine($"Sent image build request for {_request.display_x} - {_request.display_y} from connection {_request.connectionId}");
        }
예제 #20
0
        /// <summary>
        /// Agenda execução
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            try
            {
                //if (cancellationToken.IsCancellationRequested)
                //    return Task.CompletedTask;

                StartProducer();

                //Inicializa o timer que dispara o job
                while (true)
                {
                    var intervalTime = _configurationSection.GetValue <int>("SegundosExecucaoJob");
                    //_timer = new Timer(async (state) => await TimerTick(state), cancellationToken, TimeSpan.Zero, TimeSpan.FromSeconds(intervalTime));
                    var result = await _producer.ProduceAsync(_topicos[0], new Message <Null, string> {
                        Value = "Hello world " + DateTime.Now.ToString("HH:mm:ss")
                    });

                    if (result == null) //Deu o timeout, volta a executar apenas no proximo tick do timer
                    {
                        return;
                    }

                    Thread.Sleep(intervalTime * 1000);
                    _producer.Flush(TimeSpan.FromSeconds(intervalTime));

                    HandleMessage(result);
                }
            }
            catch (Exception ex)
            {
                _logger.LogCritical("Erro ao inicializar o Job de Mensageria. Verifique se a configuração esta válida no appsettings!",
                                    //rotina: nameof(MensageriaWorker),
                                    ex);
            }


            //return Task.CompletedTask;
        }
예제 #21
0
        public async void StartAsync(int val, string guid, string fromId, string toId)
        {
            var transaction = new Transaction(guid, toId, val, 0);
            var valJson     = JsonConvert.SerializeObject(transaction);

            var key            = fromId;
            var topic          = "firstTopic";
            var deliveryResult = await _producer.ProduceAsync(topic, new Message <string, string>
            {
                Value = valJson,
                Key   = key
            });

            // informacja zwrotna
            // await Console.Out.WriteLineAsync("received data\n" +
            //                                                 "Topic: " + deliveryResult.Topic +
            //                                                 "\nPartition: " + deliveryResult.Partition +
            //                                                 "\noffset: " + deliveryResult.Offset +
            //                                                 "\ntimestamp: " + deliveryResult.Timestamp.ToString());


            _producer.Flush(TimeSpan.FromSeconds(10));
        }
예제 #22
0
        public void Dispose()
        {
            var timeoutTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30));
            var cts = CancellationTokenSource.CreateLinkedTokenSource(timeoutTokenSource.Token, _cancellationTokenSource.Token);

            try
            {
                _producer.Flush(cts.Token);
            }
            catch (OperationCanceledException)
            {
            }
            catch (Exception e)
            {
                _logContext.Error?.Log(e, "Failed to dispose producer: {producerName}", _producer.Name);
            }
            finally
            {
                timeoutTokenSource.Dispose();
                _cancellationTokenSource.Dispose();
                _producer.Dispose();
            }
        }
예제 #23
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        public async Task PublishAsync <TK, T>(IList <DomainEvent <TK, T> > domainEvents) where TK : struct
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            if (domainEvents == null || !domainEvents.Any())
            {
                throw new ArgumentNullException(nameof(domainEvents));
            }

            foreach (var domainEvent in domainEvents)
            {
                var data = JsonConvert.SerializeObject(domainEvent, Formatting.Indented);
                var msg  = new Message <string, string>
                {
                    Key   = domainEvent.Id.ToString(),
                    Value = data
                };
                _producer.Produce(domainEvent.EventName, msg, (deliveryReport) =>
                {
                    if (deliveryReport.Error.Code != ErrorCode.NoError)
                    {
                        //_failedEventsEventRepository.SaveAsync(new FailedEvent
                        //{
                        //    EventId = deliveryReport.Message.Key,
                        //    Content = deliveryReport.Message.Value,
                        //    EventName = deliveryReport.Topic
                        //}).ConfigureAwait(false).GetAwaiter().GetResult();
                        Console.WriteLine($"Failed to deliver message: {deliveryReport.Error.Reason}");
                    }
                    else
                    {
                        Console.WriteLine($"Produced message to: {deliveryReport.TopicPartitionOffset}");
                    }
                });
            }
            _producer.Flush(TimeSpan.FromSeconds(10)); // wait for up to 10 seconds for any inflight messages to be delivered.
        }
예제 #24
0
    public static void sendCarRecordMessage(string message)
    {
        int len = message.Length;

        //if (configMess == null) { configMess = new ProducerConfig { BootstrapServers = brokerList}; }
        if (configMess == null)
        {
            ClientConfig clientfig = new ClientConfig();
            clientfig.BootstrapServers = brokerList;
            //clientfig.MessageMaxBytes = 92914560;
            clientfig.MessageMaxBytes = 100000000;
            //clientfig.MessageCopyMaxBytes = 1000000000;
            //clientfig.ReceiveMessageMaxBytes = 800000000;
            //clientfig.SocketSendBufferBytes = 100000000;
            //clientfig.MetadataRequestTimeoutMs = 1000 * 60;
            configMess = new ProducerConfig(clientfig);
            //configMess.
            //configMess.MessageTimeoutMs = 300000;
        }
        FileWorker.LogHelper.WriteLog("正在向kafka发送MessComm消息:" + message);
        try
        {
            if (producerMess == null)
            {
                producerMess = new ProducerBuilder <Null, string>(configMess).Build();
            }
            producerMess.Produce(messageTopicName, new Message <Null, string> {
                Value = message
            }, handler);
            producerMess.Flush(TimeSpan.FromSeconds(5));
        }
        catch (Exception e)
        {
            FileWorker.LogHelper.WriteLog("alarm error  " + e.Message);
        }
    }
예제 #25
0
 public static void sendAccessMessage(string message)
 {
     if (configAccess == null)
     {
         configAccess = new ProducerConfig {
             BootstrapServers = brokerList
         };
     }
     try
     {
         if (producerAccess == null)
         {
             producerAccess = new ProducerBuilder <Null, string>(configAccess).Build();
         }
         producerAccess.Produce(accessTopicName, new Message <Null, string> {
             Value = message
         }, handler);
         producerAccess.Flush(TimeSpan.FromSeconds(5));
     }
     catch (Exception e)
     {
         FileWorker.LogHelper.WriteLog("access error  " + e.Message);
     }
 }
예제 #26
0
 public void Flush(CancellationToken token = default) => _producer.Flush(token);
예제 #27
0
 public void Flush() => producer.Flush();
예제 #28
0
 public void Flush(TimeSpan span)
 {
     producer.Flush(span);
 }
예제 #29
0
 public void Dispose()
 {
     _producer.Flush(TimeSpan.FromSeconds(10));
     _producer.Dispose();
 }
예제 #30
0
파일: Producer.cs 프로젝트: ajeeshklr/kafka
 public void Close()
 {
     _producer.Flush();
     _producer.Dispose();
 }