@@ -303,6 +303,21 @@ func (gi *goInstance) getProducer(topicName string) (pulsar.Producer, error) {
303303 return producer , err
304304}
305305
306+ // resolveNackRedeliveryDelay returns the negative-ack redelivery delay to apply, or zero to leave
307+ // the client default in place.
308+ //
309+ // SourceSpec.NegativeAckRedeliveryDelayMs is a proto3 scalar with no presence, so an unset field
310+ // reads as 0. Only a positive value is applied, matching the guard the Java runtime uses in
311+ // JavaInstanceRunnable; a zero left in ConsumerOptions is treated by the client as unset, so the
312+ // default applies either way.
313+ func resolveNackRedeliveryDelay (delayMs uint64 ) time.Duration {
314+ if delayMs == 0 {
315+ return 0
316+ }
317+
318+ return time .Duration (delayMs ) * time .Millisecond
319+ }
320+
306321func (gi * goInstance ) setupConsumer () (chan pulsar.ConsumerMessage , error ) {
307322 subscriptionType := pulsar .Shared
308323 if int32 (gi .context .instanceConf .funcDetails .Source .SubscriptionType ) == pb .SubscriptionType_value ["FAILOVER" ] {
@@ -320,6 +335,8 @@ func (gi *goInstance) setupConsumer() (chan pulsar.ConsumerMessage, error) {
320335 funcDetails .Namespace ,
321336 funcDetails .Name ), gi .context .instanceConf .instanceID )
322337
338+ nackRedeliveryDelay := resolveNackRedeliveryDelay (funcDetails .Source .NegativeAckRedeliveryDelayMs )
339+
323340 channel := make (chan pulsar.ConsumerMessage )
324341
325342 var (
@@ -338,39 +355,43 @@ func (gi *goInstance) setupConsumer() (chan pulsar.ConsumerMessage, error) {
338355 if consumerConf .ReceiverQueueSize != nil {
339356 if consumerConf .IsRegexPattern {
340357 consumer , err = gi .client .Subscribe (pulsar.ConsumerOptions {
341- TopicsPattern : topicName .Name ,
342- ReceiverQueueSize : int (consumerConf .ReceiverQueueSize .Value ),
343- SubscriptionName : subscriptionName ,
344- Properties : properties ,
345- Type : subscriptionType ,
346- MessageChannel : channel ,
358+ TopicsPattern : topicName .Name ,
359+ ReceiverQueueSize : int (consumerConf .ReceiverQueueSize .Value ),
360+ SubscriptionName : subscriptionName ,
361+ Properties : properties ,
362+ Type : subscriptionType ,
363+ MessageChannel : channel ,
364+ NackRedeliveryDelay : nackRedeliveryDelay ,
347365 })
348366 } else {
349367 consumer , err = gi .client .Subscribe (pulsar.ConsumerOptions {
350- Topic : topicName .Name ,
351- SubscriptionName : subscriptionName ,
352- Properties : properties ,
353- Type : subscriptionType ,
354- ReceiverQueueSize : int (consumerConf .ReceiverQueueSize .Value ),
355- MessageChannel : channel ,
368+ Topic : topicName .Name ,
369+ SubscriptionName : subscriptionName ,
370+ Properties : properties ,
371+ Type : subscriptionType ,
372+ ReceiverQueueSize : int (consumerConf .ReceiverQueueSize .Value ),
373+ MessageChannel : channel ,
374+ NackRedeliveryDelay : nackRedeliveryDelay ,
356375 })
357376 }
358377 } else {
359378 if consumerConf .IsRegexPattern {
360379 consumer , err = gi .client .Subscribe (pulsar.ConsumerOptions {
361- TopicsPattern : topicName .Name ,
362- SubscriptionName : subscriptionName ,
363- Properties : properties ,
364- Type : subscriptionType ,
365- MessageChannel : channel ,
380+ TopicsPattern : topicName .Name ,
381+ SubscriptionName : subscriptionName ,
382+ Properties : properties ,
383+ Type : subscriptionType ,
384+ MessageChannel : channel ,
385+ NackRedeliveryDelay : nackRedeliveryDelay ,
366386 })
367387 } else {
368388 consumer , err = gi .client .Subscribe (pulsar.ConsumerOptions {
369- Topic : topicName .Name ,
370- SubscriptionName : subscriptionName ,
371- Properties : properties ,
372- Type : subscriptionType ,
373- MessageChannel : channel ,
389+ Topic : topicName .Name ,
390+ SubscriptionName : subscriptionName ,
391+ Properties : properties ,
392+ Type : subscriptionType ,
393+ MessageChannel : channel ,
394+ NackRedeliveryDelay : nackRedeliveryDelay ,
374395 })
375396
376397 }
0 commit comments