/// <summary> /// Initializes a new Producer instance. /// </summary> /// <param name="config"> /// librdkafka configuration parameters (refer to https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md) /// TODO: Link to confluent-kafka-dotnet page with dotnet specific parameters also (i.e. default.topic.config). /// </param> /// <param name="manualPoll"> /// If true, does not start a dedicated polling thread to trigger events or receive delivery reports - /// you must call the Poll method periodically instead. /// </param> /// <param name="disableDeliveryReports"> /// If true, disables notification of delivery reports. Note: if set to true and you use a ProduceAsync variant that return /// a Task, the Tasks will never complete. Generally you should leave this parameter as false. Set it to true for "fire and /// forget" semantics and a small boost in performance. /// </param> public Producer(IEnumerable <KeyValuePair <string, object> > config, bool manualPoll = false, bool disableDeliveryReports = false) { this.topicConfig = (IEnumerable <KeyValuePair <string, object> >)config.FirstOrDefault(prop => prop.Key == "default.topic.config").Value; this.manualPoll = manualPoll; this.disableDeliveryReports = disableDeliveryReports; var configHandle = SafeConfigHandle.Create(); config .Where(prop => prop.Key != "default.topic.config") .ToList() .ForEach((kvp) => { configHandle.Set(kvp.Key, kvp.Value.ToString()); }); IntPtr configPtr = configHandle.DangerousGetHandle(); if (!disableDeliveryReports) { LibRdKafka.conf_set_dr_msg_cb(configPtr, DeliveryReportCallback); } // Explicitly keep references to delegates so they are not reclaimed by the GC. errorDelegate = ErrorCallback; logDelegate = LogCallback; statsDelegate = StatsCallback; // TODO: provide some mechanism whereby calls to the error and log callbacks are cached until // such time as event handlers have had a chance to be registered. LibRdKafka.conf_set_error_cb(configPtr, errorDelegate); LibRdKafka.conf_set_log_cb(configPtr, logDelegate); LibRdKafka.conf_set_stats_cb(configPtr, statsDelegate); this.kafkaHandle = SafeKafkaHandle.Create(RdKafkaType.Producer, configPtr); configHandle.SetHandleAsInvalid(); // config object is no longer useable. if (!manualPoll) { callbackCts = new CancellationTokenSource(); callbackTask = StartPollTask(callbackCts.Token); } }
internal static extern void rd_kafka_conf_set_error_cb( IntPtr conf, LibRdKafka.ErrorDelegate error_cb);