public Task <DeliveryReport> Produce(byte[] payload, byte[] key = null, Int32 partition = RD_KAFKA_PARTITION_UA) { // Passes the TaskCompletionSource to the delivery report callback // via the msg_opaque pointer var deliveryCompletionSource = new TaskCompletionSource <DeliveryReport>(); var gch = GCHandle.Alloc(deliveryCompletionSource); while (true) { if (handle.Produce(payload, key, partition, GCHandle.ToIntPtr(gch)) == 0) { // Successfully enqueued produce request break; } ErrorCode err = LibRdKafka.last_error(); if (err == ErrorCode._QUEUE_FULL) { // Wait and retry Task.Delay(TimeSpan.FromMilliseconds(50)).Wait(); } else { gch.Free(); throw RdKafkaException.FromErr(err, "Could not produce message"); } } return(deliveryCompletionSource.Task); }
private void Produce(byte[] payload, byte[] key, Int32 partition, object deliveryHandler) { var gch = GCHandle.Alloc(deliveryHandler); var ptr = GCHandle.ToIntPtr(gch); while (true) { if (handle.Produce(payload, key, partition, ptr) == 0) { // Successfully enqueued produce request break; } var err = LibRdKafka.last_error(); if (err == ErrorCode._QUEUE_FULL) { // Wait and retry Task.Delay(TimeSpan.FromMilliseconds(50)).Wait(); } else { gch.Free(); throw RdKafkaException.FromErr(err, "Could not produce message"); } } }
private void Produce(byte[] payload, int payloadCount, byte[] key, int keyCount, Int32 partition, object deliveryHandler, bool blockIfQueueFull) { var gch = GCHandle.Alloc(deliveryHandler); var ptr = GCHandle.ToIntPtr(gch); if (handle.Produce(payload, payloadCount, key, keyCount, partition, ptr, blockIfQueueFull) != 0) { var err = LibRdKafka.last_error(); gch.Free(); throw RdKafkaException.FromErr(err, "Could not produce message"); } }
private static void DeliveryReportCallback(IntPtr rk, ref rd_kafka_message rkmessage, IntPtr opaque) { // msg_opaque was set by Topic.Produce var gch = GCHandle.FromIntPtr(rkmessage._private); var deliveryHandler = (IDeliveryHandler)gch.Target; gch.Free(); if (rkmessage.err != 0) { deliveryHandler.SetException( RdKafkaException.FromErr( rkmessage.err, "Failed to produce message")); return; } deliveryHandler.SetResult(new DeliveryReport { Offset = rkmessage.offset, Partition = rkmessage.partition }); }
static void DeliveryReportCallback(IntPtr rk, ref rd_kafka_message rkmessage, IntPtr opaque) { // msg_opaque was set by Topic.Produce var gch = GCHandle.FromIntPtr(rkmessage._private); var deliveryCompletionSource = (TaskCompletionSource <DeliveryReport>)gch.Target; gch.Free(); if (rkmessage.err != 0) { deliveryCompletionSource.SetException( RdKafkaException.FromErr( rkmessage.err, Marshal.PtrToStringAnsi(rkmessage.payload))); return; } deliveryCompletionSource.SetResult(new DeliveryReport() { Offset = rkmessage.offset, Partition = rkmessage.partition }); }