@@ -89,63 +89,69 @@ type (
89
89
fx.In
90
90
91
91
Lifecycle fx.Lifecycle
92
- Factories []QueueFactory
92
+ Factories []QueueFactory `group:"queueFactory"`
93
93
}
94
94
)
95
95
96
96
var QueueModule = fx .Options (
97
97
fx .Provide (QueueSchedulerRateLimiterProvider ),
98
98
fx .Provide (
99
99
fx.Annotated {
100
- Name : "transferQueueFactory" ,
100
+ Group : QueueFactoryFxGroup ,
101
101
Target : NewTransferQueueFactory ,
102
102
},
103
103
fx.Annotated {
104
- Name : "timerQueueFactory" ,
104
+ Group : QueueFactoryFxGroup ,
105
105
Target : NewTimerQueueFactory ,
106
106
},
107
107
fx.Annotated {
108
- Name : "visibilityQueueFactory" ,
108
+ Group : QueueFactoryFxGroup ,
109
109
Target : NewVisibilityQueueFactory ,
110
110
},
111
- fx.Annotated {
112
- Name : "archivalQueueFactory" ,
113
- Target : NewArchivalQueueFactory ,
114
- },
115
- getQueueFactories ,
111
+ getOptionalQueueFactories ,
116
112
),
117
113
fx .Invoke (QueueFactoryLifetimeHooks ),
118
114
)
119
115
120
- type queueFactorySet struct {
121
- fx.In
122
-
123
- TransferQueueFactory QueueFactory `name:"transferQueueFactory"`
124
- TimerQueueFactory QueueFactory `name:"timerQueueFactory"`
125
- VisibilityQueueFactory QueueFactory `name:"visibilityQueueFactory"`
126
- ArchivalQueueFactory QueueFactory `name:"archivalQueueFactory"`
116
+ // additionalQueueFactories is a container for a list of queue factories that are only added to the group if
117
+ // they are enabled. This exists because there is no way to conditionally add to a group with a provider that returns
118
+ // a single object. For example, this doesn't work because it will always add the factory to the group, which can
119
+ // cause NPEs:
120
+ //
121
+ // fx.Annotated{
122
+ // Group: "queueFactory",
123
+ // Target: func() QueueFactory { return isEnabled ? NewQueueFactory() : nil },
124
+ // },
125
+ type additionalQueueFactories struct {
126
+ // This is what tells fx to add the factories to the group whenever this object is provided.
127
+ fx.Out
128
+
129
+ // Factories is a list of queue factories that will be added to the `group:"queueFactory"` group.
130
+ Factories []QueueFactory `group:"queueFactory,flatten"`
127
131
}
128
132
129
- // getQueueFactories returns factories for all the enabled queue types.
130
- // The archival queue factory is only returned when archival is enabled in the static config.
131
- func getQueueFactories (
132
- queueFactorySet queueFactorySet ,
133
+ // getOptionalQueueFactories returns an additionalQueueFactories which contains a list of queue factories that will be
134
+ // added to the `group:"queueFactory"` group. The factories are added to the group only if they are enabled, which
135
+ // is why we must return a list here.
136
+ func getOptionalQueueFactories (
133
137
archivalMetadata archiver.ArchivalMetadata ,
134
- ) []QueueFactory {
135
- factories := []QueueFactory {
136
- queueFactorySet .TransferQueueFactory ,
137
- queueFactorySet .TimerQueueFactory ,
138
- queueFactorySet .VisibilityQueueFactory ,
139
- }
138
+ params ArchivalQueueFactoryParams ,
139
+ ) additionalQueueFactories {
140
+
140
141
c := tasks .CategoryArchival
141
- // this will only affect tests because this method is only called once in production,
142
+ // Removing this category will only affect tests because this method is only called once in production,
142
143
// but it may be called many times across test runs, which would leave the archival queue as a dangling category
143
144
tasks .RemoveCategory (c .ID ())
144
- if archivalMetadata .GetHistoryConfig ().StaticClusterState () == archiver .ArchivalEnabled || archivalMetadata .GetVisibilityConfig ().StaticClusterState () == archiver .ArchivalEnabled {
145
- factories = append (factories , queueFactorySet .ArchivalQueueFactory )
146
- tasks .NewCategory (c .ID (), c .Type (), c .Name ())
145
+ if archivalMetadata .GetHistoryConfig ().StaticClusterState () != archiver .ArchivalEnabled &&
146
+ archivalMetadata .GetVisibilityConfig ().StaticClusterState () != archiver .ArchivalEnabled {
147
+ return additionalQueueFactories {}
148
+ }
149
+ tasks .NewCategory (c .ID (), c .Type (), c .Name ())
150
+ return additionalQueueFactories {
151
+ Factories : []QueueFactory {
152
+ NewArchivalQueueFactory (params ),
153
+ },
147
154
}
148
- return factories
149
155
}
150
156
151
157
func QueueSchedulerRateLimiterProvider (
0 commit comments