88 "time"
99
1010 // Packages
11+ marshaler "github.com/djthorpe/go-marshaler"
1112 pg "github.com/djthorpe/go-pg"
1213 server "github.com/mutablelogic/go-server"
1314 pgqueue "github.com/mutablelogic/go-server/pkg/pgqueue"
@@ -24,6 +25,7 @@ type task struct {
2425 manager * pgqueue.Manager
2526 taskpool * pgqueue.TaskPool
2627 callbacks map [string ]server.PGCallback
28+ decoder * marshaler.Decoder
2729}
2830
2931var _ server.Task = (* task )(nil )
@@ -36,6 +38,7 @@ func NewTask(manager *pgqueue.Manager, threads uint) (server.Task, error) {
3638 self .manager = manager
3739 self .taskpool = pgqueue .NewTaskPool (threads )
3840 self .callbacks = make (map [string ]server.PGCallback , 100 )
41+ self .decoder = marshaler .NewDecoder ("json" , marshaler .ConvertTime , marshaler .ConvertDuration , marshaler .ConvertIntUint )
3942 return self , nil
4043}
4144
@@ -120,8 +123,23 @@ FOR_LOOP:
120123 case evt := <- taskch :
121124 task .tryTask (ctx , task .taskpool , evt )
122125 case evt := <- cleanupch :
123- if namespace_queue := splitName (evt .Ticker , 2 ); len (namespace_queue ) == 2 {
124- ref .Log (ctx ).Print (parent , "CLEANUP TICKER ns=" , namespace_queue [0 ], " queue=" , namespace_queue [1 ])
126+ var namespace_queue []string
127+ if err := task .UnmarshalPayload (& namespace_queue , evt .Payload ); err != nil {
128+ ref .Log (ctx ).With ("ticker" , evt ).Print (parent , err )
129+ } else if len (namespace_queue ) == 2 && namespace_queue [0 ] == task .manager .Namespace () {
130+ n := 0
131+ for {
132+ tasks , err := task .manager .CleanQueue (ctx , namespace_queue [1 ])
133+ if err != nil {
134+ ref .Log (ctx ).With ("ticker" , evt ).Print (parent , "clean queue:" , err )
135+ break
136+ }
137+ if len (tasks ) == 0 {
138+ break
139+ }
140+ n += len (tasks )
141+ }
142+ ref .Log (ctx ).With ("ticker" , evt ).Debug (parent , "removed " , n , " tasks from queue" )
125143 }
126144 }
127145 }
@@ -139,7 +157,7 @@ FOR_LOOP:
139157// RegisterTicker registers a periodic task (ticker) with a callback function.
140158// It returns the metadata of the registered ticker.
141159func (t * task ) RegisterTicker (ctx context.Context , meta schema.TickerMeta , fn server.PGCallback ) (* schema.Ticker , error ) {
142- ref .Log (ctx ).Print (ctx , "Register ticker: " , meta .Ticker )
160+ ref .Log (ctx ).Debug (ctx , "Register ticker: " , meta .Ticker , " in namespace " , t . manager . Namespace () )
143161 ticker , err := t .manager .RegisterTicker (ctx , meta )
144162 if err != nil {
145163 return nil , err
@@ -155,7 +173,7 @@ func (t *task) RegisterTicker(ctx context.Context, meta schema.TickerMeta, fn se
155173// RegisterQueue registers a task queue with a callback function.
156174// It returns the metadata of the registered queue.
157175func (t * task ) RegisterQueue (ctx context.Context , meta schema.QueueMeta , fn server.PGCallback ) (* schema.Queue , error ) {
158- ref .Log (ctx ).Print (ctx , "Register queue: " , meta .Queue )
176+ ref .Log (ctx ).Debug (ctx , "Register queue: " , meta .Queue , " in namespace " , t . manager . Namespace () )
159177 queue , err := t .manager .RegisterQueue (ctx , meta )
160178 if err != nil {
161179 return nil , err
@@ -164,6 +182,7 @@ func (t *task) RegisterQueue(ctx context.Context, meta schema.QueueMeta, fn serv
164182 // Register a queue cleanup timer
165183 if ticker , err := t .manager .RegisterTickerNs (ctx , schema .CleanupNamespace , schema.TickerMeta {
166184 Ticker : joinName (queue .Namespace , queue .Queue ),
185+ Payload : []string {queue .Namespace , queue .Queue },
167186 Interval : queue .TTL ,
168187 }); err != nil {
169188 _ , err_ := t .manager .DeleteQueue (ctx , meta .Queue )
@@ -197,6 +216,11 @@ func (t *task) CreateTask(ctx context.Context, queue string, payload any, delay
197216 return t .manager .CreateTask (ctx , queue , meta )
198217}
199218
219+ // Convert a payload into a struct
220+ func (t * task ) UnmarshalPayload (dest any , payload any ) error {
221+ return t .decoder .Decode (payload , dest )
222+ }
223+
200224////////////////////////////////////////////////////////////////////////////////
201225// PRIVATE METHODS
202226
@@ -250,7 +274,7 @@ func (t *task) getTaskCallback(task *schema.Task) server.PGCallback {
250274 return t .callbacks [key ]
251275}
252276
253- const namespaceSeparator = "/ "
277+ const namespaceSeparator = "_ "
254278
255279func joinName (parts ... string ) string {
256280 return strings .Join (parts , namespaceSeparator )
0 commit comments