private static void Transaction(PulsarClient pulsarClient) { var txn = (Transaction)pulsarClient.NewTransaction().WithTransactionTimeout(TimeSpan.FromMinutes(5)).Build(); var producer = pulsarClient.NewProducer(new ProducerConfigBuilder <byte[]>() .SendTimeout(0) .Topic(myTopic)); var consumer = pulsarClient.NewConsumer(new ConsumerConfigBuilder <byte[]>() .Topic(myTopic) .ForceTopicCreation(true) .SubscriptionName("myTopic-sub")); for (var i = 0; i < 10; i++) { var text = $"tuts-{i}"; var data = Encoding.UTF8.GetBytes(text); producer.NewMessage(txn).Value(data).Send(); Console.WriteLine($"produced: {text}"); } var pool = ArrayPool <byte> .Shared; //Should not consume messages as the transaction is not committed yet for (var i = 0; i < 10; ++i) { var message = (Message <byte[]>)consumer.Receive(); if (message != null) { var payload = pool.Rent((int)message.Data.Length); Array.Copy(sourceArray: message.Data.ToArray(), destinationArray: payload, length: (int)message.Data.Length); consumer.Acknowledge(message); var res = Encoding.UTF8.GetString(message.Data); Console.WriteLine($"[1] message '{res}' from topic: {message.TopicName}"); } } txn.Commit(); for (var i = 0; i < 10; i++) { var message = (Message <byte[]>)consumer.Receive(); if (message != null) { var payload = pool.Rent((int)message.Data.Length); Array.Copy(sourceArray: message.Data.ToArray(), destinationArray: payload, length: (int)message.Data.Length); consumer.Acknowledge(message); var res = Encoding.UTF8.GetString(message.Data); Console.WriteLine($"[2] message '{res}' from topic: {message.TopicName}"); } } }