55 "context"
66 "encoding/base64"
77 "encoding/gob"
8+ "log/slog"
89 "math"
910 "math/rand"
1011 "time"
@@ -132,6 +133,8 @@ func NewWorkflowQueue(dbosCtx DBOSContext, name string, options ...QueueOption)
132133}
133134
134135type queueRunner struct {
136+ logger * slog.Logger
137+
135138 // Queue runner iteration parameters
136139 baseInterval float64
137140 minInterval float64
@@ -148,7 +151,7 @@ type queueRunner struct {
148151 completionChan chan struct {}
149152}
150153
151- func newQueueRunner () * queueRunner {
154+ func newQueueRunner (logger * slog. Logger ) * queueRunner {
152155 return & queueRunner {
153156 baseInterval : 1.0 ,
154157 minInterval : 1.0 ,
@@ -159,6 +162,7 @@ func newQueueRunner() *queueRunner {
159162 jitterMax : 1.05 ,
160163 workflowQueueRegistry : make (map [string ]WorkflowQueue ),
161164 completionChan : make (chan struct {}, 1 ),
165+ logger : logger .With ("service" , "queue_runner" ),
162166 }
163167}
164168
@@ -193,31 +197,31 @@ func (qr *queueRunner) run(ctx *dbosContext) {
193197 hasBackoffError = true
194198 }
195199 } else {
196- ctx .logger .Error ("Error dequeuing workflows from queue" , "queue_name" , queueName , "error" , err )
200+ qr .logger .Error ("Error dequeuing workflows from queue" , "queue_name" , queueName , "error" , err )
197201 }
198202 continue
199203 }
200204
201205 if len (dequeuedWorkflows ) > 0 {
202- ctx .logger .Debug ("Dequeued workflows from queue" , "queue_name" , queueName , "workflows" , dequeuedWorkflows )
206+ qr .logger .Debug ("Dequeued workflows from queue" , "queue_name" , queueName , "workflows" , dequeuedWorkflows )
203207 }
204208 for _ , workflow := range dequeuedWorkflows {
205209 // Find the workflow in the registry
206210
207211 wfName , ok := ctx .workflowCustomNametoFQN .Load (workflow .name )
208212 if ! ok {
209- ctx .logger .Error ("Workflow not found in registry" , "workflow_name" , workflow .name )
213+ qr .logger .Error ("Workflow not found in registry" , "workflow_name" , workflow .name )
210214 continue
211215 }
212216
213217 registeredWorkflowAny , exists := ctx .workflowRegistry .Load (wfName .(string ))
214218 if ! exists {
215- ctx .logger .Error ("workflow function not found in registry" , "workflow_name" , workflow .name )
219+ qr .logger .Error ("workflow function not found in registry" , "workflow_name" , workflow .name )
216220 continue
217221 }
218222 registeredWorkflow , ok := registeredWorkflowAny .(workflowRegistryEntry )
219223 if ! ok {
220- ctx .logger .Error ("invalid workflow registry entry type" , "workflow_name" , workflow .name )
224+ qr .logger .Error ("invalid workflow registry entry type" , "workflow_name" , workflow .name )
221225 continue
222226 }
223227
@@ -226,20 +230,20 @@ func (qr *queueRunner) run(ctx *dbosContext) {
226230 if len (workflow .input ) > 0 {
227231 inputBytes , err := base64 .StdEncoding .DecodeString (workflow .input )
228232 if err != nil {
229- ctx .logger .Error ("failed to decode input for workflow" , "workflow_id" , workflow .id , "error" , err )
233+ qr .logger .Error ("failed to decode input for workflow" , "workflow_id" , workflow .id , "error" , err )
230234 continue
231235 }
232236 buf := bytes .NewBuffer (inputBytes )
233237 dec := gob .NewDecoder (buf )
234238 if err := dec .Decode (& input ); err != nil {
235- ctx .logger .Error ("failed to decode input for workflow" , "workflow_id" , workflow .id , "error" , err )
239+ qr .logger .Error ("failed to decode input for workflow" , "workflow_id" , workflow .id , "error" , err )
236240 continue
237241 }
238242 }
239243
240244 _ , err := registeredWorkflow .wrappedFunction (ctx , input , WithWorkflowID (workflow .id ))
241245 if err != nil {
242- ctx .logger .Error ("Error running queued workflow" , "error" , err )
246+ qr .logger .Error ("Error running queued workflow" , "error" , err )
243247 }
244248 }
245249 }
@@ -260,7 +264,7 @@ func (qr *queueRunner) run(ctx *dbosContext) {
260264 // Sleep with jittered interval, but allow early exit on context cancellation
261265 select {
262266 case <- ctx .Done ():
263- ctx .logger .Info ("Queue runner stopping due to context cancellation" , "cause" , context .Cause (ctx ))
267+ qr .logger .Info ("Queue runner stopping due to context cancellation" , "cause" , context .Cause (ctx ))
264268 qr .completionChan <- struct {}{}
265269 return
266270 case <- time .After (sleepDuration ):
0 commit comments