public static ReadOnlySequence <byte> NewSubscribe(string topic, string subscription, long consumerId, long requestId, CommandSubscribe.SubType subType, int priorityLevel, string consumerName, bool isDurable, MessageIdData startMessageId, IDictionary <string, string> metadata, bool readCompacted, bool isReplicated, CommandSubscribe.InitialPosition subscriptionInitialPosition, long startMessageRollbackDurationInSec, ISchemaInfo schemaInfo, bool createTopicIfDoesNotExist, KeySharedPolicy keySharedPolicy) { var subscribe = new CommandSubscribe { Topic = topic, Subscription = subscription, subType = subType, ConsumerId = (ulong)consumerId, ConsumerName = consumerName, RequestId = (ulong)requestId, PriorityLevel = priorityLevel, Durable = isDurable, ReadCompacted = readCompacted, initialPosition = subscriptionInitialPosition, ReplicateSubscriptionState = isReplicated, ForceTopicCreation = createTopicIfDoesNotExist }; if (keySharedPolicy != null) { var keySharedMeta = new KeySharedMeta { allowOutOfOrderDelivery = keySharedPolicy.AllowOutOfOrderDelivery, keySharedMode = ConvertKeySharedMode(keySharedPolicy.KeySharedMode) }; if (keySharedPolicy is KeySharedPolicy.KeySharedPolicySticky sticky) { var ranges = sticky.GetRanges().Ranges; foreach (var range in ranges) { keySharedMeta.hashRanges.Add(new IntRange { Start = range.Start, End = range.End }); } } subscribe.keySharedMeta = keySharedMeta; } if (startMessageId != null) { subscribe.StartMessageId = startMessageId; } if (startMessageRollbackDurationInSec > 0) { subscribe.StartMessageRollbackDurationSec = (ulong)startMessageRollbackDurationInSec; } subscribe.Metadatas.AddRange(CommandUtils.ToKeyValueList(metadata)); if (schemaInfo != null) { var schema = GetSchema(schemaInfo); subscribe.Schema = schema; } return(Serializer.Serialize(subscribe.ToBaseCommand())); }
public static ReadOnlySequence <byte> NewSubscribe(string topic, string subscription, long consumerId, long requestId, CommandSubscribe.SubType subType, int priorityLevel, string consumerName, bool isDurable, MessageIdData startMessageId, IDictionary <string, string> metadata, bool readCompacted, bool isReplicated, CommandSubscribe.InitialPosition subscriptionInitialPosition, long startMessageRollbackDurationInSec, ISchemaInfo schemaInfo, bool createTopicIfDoesNotExist) { return(NewSubscribe(topic, subscription, consumerId, requestId, subType, priorityLevel, consumerName, isDurable, startMessageId, metadata, readCompacted, isReplicated, subscriptionInitialPosition, startMessageRollbackDurationInSec, schemaInfo, createTopicIfDoesNotExist, null)); }
public ConsumerConfigBuilder <T> SubscriptionType(CommandSubscribe.SubType subscriptionType) { _conf.SubscriptionType = subscriptionType; return(this); }
public static ReadOnlySequence <byte> NewSubscribe(string topic, string subscription, long consumerId, long requestId, CommandSubscribe.SubType subType, int priorityLevel, string consumerName, long resetStartMessageBackInSeconds) { return(NewSubscribe(topic, subscription, consumerId, requestId, subType, priorityLevel, consumerName, true, null, new Dictionary <string, string>(), false, false, CommandSubscribe.InitialPosition.Earliest, resetStartMessageBackInSeconds, null, true)); }
private void TestNegativeAcks(bool batching, bool usePartition, CommandSubscribe.SubType subscriptionType, int negAcksDelayMillis, int ackTimeout) { _output.WriteLine($"Test negative acks batching={batching} partitions={usePartition} subType={subscriptionType} negAckDelayMs={negAcksDelayMillis}"); var topic = "testNegativeAcks-" + DateTime.Now.Ticks; var builder = new ConsumerConfigBuilder <byte[]>() .Topic(topic) .SubscriptionName($"sub1-{Guid.NewGuid()}") .AckTimeout(TimeSpan.FromMilliseconds(ackTimeout)) .ForceTopicCreation(true) .AcknowledgmentGroupTime(0) .NegativeAckRedeliveryDelay(TimeSpan.FromMilliseconds(negAcksDelayMillis)) .SubscriptionType(subscriptionType); var consumer = _client.NewConsumer(builder); var pBuilder = new ProducerConfigBuilder <byte[]>(); pBuilder.Topic(topic); if (batching) { pBuilder.EnableBatching(batching); pBuilder.BatchingMaxPublishDelay(TimeSpan.FromMilliseconds(negAcksDelayMillis)); pBuilder.BatchingMaxMessages(10); } var producer = _client.NewProducer(pBuilder); ISet <string> sentMessages = new HashSet <string>(); const int n = 10; for (var i = 0; i < n; i++) { var value = "test-" + i; producer.Send(Encoding.UTF8.GetBytes(value)); sentMessages.Add(value); } Thread.Sleep(TimeSpan.FromSeconds(10)); for (var i = 0; i < n; i++) { var msg = consumer.Receive(); if (msg != null) { var ms = Encoding.UTF8.GetString(msg.Data); consumer.NegativeAcknowledge(msg); _output.WriteLine(ms); } } ISet <string> receivedMessages = new HashSet <string>(); Thread.Sleep(TimeSpan.FromSeconds(10)); // All the messages should be received again for (var i = 0; i < n; i++) { var msg = consumer.Receive(); if (msg != null) { var ms = Encoding.UTF8.GetString(msg.Data); _output.WriteLine(ms); receivedMessages.Add(ms); consumer.Acknowledge(msg); } } Assert.Equal(sentMessages, receivedMessages); var nu = consumer.Receive(); // There should be no more messages Assert.Null(nu); producer.Close(); consumer.Close(); }