@@ -73,10 +73,12 @@ type (
73
73
subject string
74
74
metadata map [string ]string
75
75
queueGroup string
76
+ qgDisabled bool
76
77
}
77
78
78
79
groupOpts struct {
79
80
queueGroup string
81
+ qgDisabled bool
80
82
}
81
83
82
84
// ErrHandler is a function used to configure a custom error handler for a service,
@@ -152,9 +154,10 @@ type (
152
154
}
153
155
154
156
group struct {
155
- service * service
156
- prefix string
157
- queueGroup string
157
+ service * service
158
+ prefix string
159
+ queueGroup string
160
+ queueGroupDisabled bool
158
161
}
159
162
160
163
// Verb represents a name of the monitoring service.
@@ -182,6 +185,9 @@ type (
182
185
// QueueGroup can be used to override the default queue group name.
183
186
QueueGroup string `json:"queue_group"`
184
187
188
+ // QueueGroupDisabled disables the queue group for the service.
189
+ QueueGroupDisabled bool `json:"queue_group_disabled"`
190
+
185
191
// StatsHandler is a user-defined custom function.
186
192
// used to calculate additional service stats.
187
193
StatsHandler StatsHandler
@@ -205,6 +211,9 @@ type (
205
211
206
212
// QueueGroup can be used to override the default queue group name.
207
213
QueueGroup string `json:"queue_group"`
214
+
215
+ // QueueGroupDisabled disables the queue group for the endpoint.
216
+ QueueGroupDisabled bool `json:"queue_group_disabled"`
208
217
}
209
218
210
219
// NATSError represents an error returned by a NATS Subscription.
@@ -397,11 +406,11 @@ func (s *service) AddEndpoint(name string, handler Handler, opts ...EndpointOpt)
397
406
if options .subject != "" {
398
407
subject = options .subject
399
408
}
400
- queueGroup := queueGroupName (options .queueGroup , s .Config .QueueGroup )
401
- return addEndpoint (s , name , subject , handler , options .metadata , queueGroup )
409
+ queueGroup , noQueue := resolveQueueGroup (options .queueGroup , s .Config .QueueGroup , options . qgDisabled , s . Config . QueueGroupDisabled )
410
+ return addEndpoint (s , name , subject , handler , options .metadata , queueGroup , noQueue )
402
411
}
403
412
404
- func addEndpoint (s * service , name , subject string , handler Handler , metadata map [string ]string , queueGroup string ) error {
413
+ func addEndpoint (s * service , name , subject string , handler Handler , metadata map [string ]string , queueGroup string , noQueue bool ) error {
405
414
if ! nameRegexp .MatchString (name ) {
406
415
return fmt .Errorf ("%w: invalid endpoint name" , ErrConfigValidation )
407
416
}
@@ -414,21 +423,34 @@ func addEndpoint(s *service, name, subject string, handler Handler, metadata map
414
423
endpoint := & Endpoint {
415
424
service : s ,
416
425
EndpointConfig : EndpointConfig {
417
- Subject : subject ,
418
- Handler : handler ,
419
- Metadata : metadata ,
420
- QueueGroup : queueGroup ,
426
+ Subject : subject ,
427
+ Handler : handler ,
428
+ Metadata : metadata ,
429
+ QueueGroup : queueGroup ,
430
+ QueueGroupDisabled : noQueue ,
421
431
},
422
432
Name : name ,
423
433
}
424
434
425
- sub , err := s .nc .QueueSubscribe (
426
- subject ,
427
- queueGroup ,
428
- func (m * nats.Msg ) {
429
- s .reqHandler (endpoint , & request {msg : m })
430
- },
431
- )
435
+ var sub * nats.Subscription
436
+ var err error
437
+
438
+ if ! noQueue {
439
+ sub , err = s .nc .QueueSubscribe (
440
+ subject ,
441
+ queueGroup ,
442
+ func (m * nats.Msg ) {
443
+ s .reqHandler (endpoint , & request {msg : m })
444
+ },
445
+ )
446
+ } else {
447
+ sub , err = s .nc .Subscribe (
448
+ subject ,
449
+ func (m * nats.Msg ) {
450
+ s .reqHandler (endpoint , & request {msg : m })
451
+ },
452
+ )
453
+ }
432
454
if err != nil {
433
455
return err
434
456
}
@@ -449,11 +471,12 @@ func (s *service) AddGroup(name string, opts ...GroupOpt) Group {
449
471
for _ , opt := range opts {
450
472
opt (& o )
451
473
}
452
- queueGroup := queueGroupName (o .queueGroup , s .Config .QueueGroup )
474
+ queueGroup , noQueue := resolveQueueGroup (o .queueGroup , s .Config .QueueGroup , o . qgDisabled , s . Config . QueueGroupDisabled )
453
475
return & group {
454
- service : s ,
455
- prefix : name ,
456
- queueGroup : queueGroup ,
476
+ service : s ,
477
+ prefix : name ,
478
+ queueGroup : queueGroup ,
479
+ queueGroupDisabled : noQueue ,
457
480
}
458
481
}
459
482
@@ -797,29 +820,33 @@ func (g *group) AddEndpoint(name string, handler Handler, opts ...EndpointOpt) e
797
820
if g .prefix == "" {
798
821
endpointSubject = subject
799
822
}
800
- queueGroup := queueGroupName (options .queueGroup , g .queueGroup )
823
+ queueGroup , noQueue := resolveQueueGroup (options .queueGroup , g .queueGroup , options . qgDisabled , g . queueGroupDisabled )
801
824
802
- return addEndpoint (g .service , name , endpointSubject , handler , options .metadata , queueGroup )
825
+ return addEndpoint (g .service , name , endpointSubject , handler , options .metadata , queueGroup , noQueue )
803
826
}
804
827
805
- func queueGroupName (customQG , parentQG string ) string {
806
- queueGroup := customQG
807
- if queueGroup == "" {
808
- if parentQG != "" {
809
- queueGroup = parentQG
810
- } else {
811
- queueGroup = DefaultQueueGroup
812
- }
828
+ func resolveQueueGroup (customQG , parentQG string , disabled , parentDisabled bool ) (string , bool ) {
829
+ if disabled {
830
+ return "" , true
831
+ }
832
+ if customQG != "" {
833
+ return customQG , false
834
+ }
835
+ if parentDisabled {
836
+ return "" , true
813
837
}
814
- return queueGroup
838
+ if parentQG != "" {
839
+ return parentQG , false
840
+ }
841
+ return DefaultQueueGroup , false
815
842
}
816
843
817
844
func (g * group ) AddGroup (name string , opts ... GroupOpt ) Group {
818
845
var o groupOpts
819
846
for _ , opt := range opts {
820
847
opt (& o )
821
848
}
822
- queueGroup := queueGroupName (o .queueGroup , g .queueGroup )
849
+ queueGroup , noQueue := resolveQueueGroup (o .queueGroup , g .queueGroup , o . qgDisabled , g . queueGroupDisabled )
823
850
824
851
parts := make ([]string , 0 , 2 )
825
852
if g .prefix != "" {
@@ -831,9 +858,10 @@ func (g *group) AddGroup(name string, opts ...GroupOpt) Group {
831
858
prefix := strings .Join (parts , "." )
832
859
833
860
return & group {
834
- service : g .service ,
835
- prefix : prefix ,
836
- queueGroup : queueGroup ,
861
+ service : g .service ,
862
+ prefix : prefix ,
863
+ queueGroup : queueGroup ,
864
+ queueGroupDisabled : noQueue ,
837
865
}
838
866
}
839
867
@@ -907,8 +935,21 @@ func WithEndpointQueueGroup(queueGroup string) EndpointOpt {
907
935
}
908
936
}
909
937
938
+ func WithEndpointQueueGroupDisabled () EndpointOpt {
939
+ return func (e * endpointOpts ) error {
940
+ e .qgDisabled = true
941
+ return nil
942
+ }
943
+ }
944
+
910
945
func WithGroupQueueGroup (queueGroup string ) GroupOpt {
911
946
return func (g * groupOpts ) {
912
947
g .queueGroup = queueGroup
913
948
}
914
949
}
950
+
951
+ func WithGroupQueueGroupDisabled () GroupOpt {
952
+ return func (g * groupOpts ) {
953
+ g .qgDisabled = true
954
+ }
955
+ }
0 commit comments