2020-01-03 10:13:16 +08:00
|
|
|
// Copyright 2020 Kentaro Hibino. All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT license
|
|
|
|
// that can be found in the LICENSE file.
|
|
|
|
|
2019-12-06 22:12:44 +08:00
|
|
|
/*
|
2020-09-08 01:44:10 +08:00
|
|
|
Package asynq provides a framework for Redis based distrubted task queue.
|
2019-12-06 22:12:44 +08:00
|
|
|
|
2020-09-08 01:44:10 +08:00
|
|
|
Asynq uses Redis as a message broker. To connect to redis,
|
|
|
|
specify the connection using one of RedisConnOpt types.
|
2020-01-15 13:19:06 +08:00
|
|
|
|
2020-09-08 01:44:10 +08:00
|
|
|
redisConnOpt = asynq.RedisClientOpt{
|
2020-02-24 07:40:04 +08:00
|
|
|
Addr: "127.0.0.1:6379",
|
|
|
|
Password: "xxxxx",
|
2021-03-21 04:42:13 +08:00
|
|
|
DB: 2,
|
2020-01-15 13:19:06 +08:00
|
|
|
}
|
|
|
|
|
2020-09-08 01:44:10 +08:00
|
|
|
The Client is used to enqueue a task.
|
2019-12-06 22:12:44 +08:00
|
|
|
|
2020-01-15 13:19:06 +08:00
|
|
|
|
2020-09-08 01:44:10 +08:00
|
|
|
client := asynq.NewClient(redisConnOpt)
|
2019-12-06 22:12:44 +08:00
|
|
|
|
2020-09-08 01:44:10 +08:00
|
|
|
// Task is created with two parameters: its type and payload.
|
2021-03-21 04:42:13 +08:00
|
|
|
// Payload data is simply an array of bytes. It can be encoded in JSON, Protocol Buffer, Gob, etc.
|
|
|
|
b, err := json.Marshal(ExamplePayload{UserID: 42})
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
task := asynq.NewTask("example", b)
|
2019-12-06 22:12:44 +08:00
|
|
|
|
2020-02-24 07:40:04 +08:00
|
|
|
// Enqueue the task to be processed immediately.
|
2021-03-21 04:42:13 +08:00
|
|
|
res, err := client.Enqueue(task)
|
2020-02-24 07:40:04 +08:00
|
|
|
|
2020-04-15 22:30:59 +08:00
|
|
|
// Schedule the task to be processed after one minute.
|
2020-09-08 01:44:10 +08:00
|
|
|
res, err = client.Enqueue(t, asynq.ProcessIn(1*time.Minute))
|
2019-12-06 22:12:44 +08:00
|
|
|
|
2020-09-08 01:44:10 +08:00
|
|
|
The Server is used to run the task processing workers with a given
|
2020-01-03 11:47:04 +08:00
|
|
|
handler.
|
2020-09-08 01:44:10 +08:00
|
|
|
srv := asynq.NewServer(redisConnOpt, asynq.Config{
|
2020-01-03 11:47:04 +08:00
|
|
|
Concurrency: 10,
|
2019-12-06 22:12:44 +08:00
|
|
|
})
|
|
|
|
|
2020-09-08 01:44:10 +08:00
|
|
|
if err := srv.Run(handler); err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2019-12-06 22:12:44 +08:00
|
|
|
|
2020-04-15 22:30:59 +08:00
|
|
|
Handler is an interface type with a method which
|
2020-01-03 11:47:04 +08:00
|
|
|
takes a task and returns an error. Handler should return nil if
|
|
|
|
the processing is successful, otherwise return a non-nil error.
|
2020-01-15 13:19:06 +08:00
|
|
|
If handler panics or returns a non-nil error, the task will be retried in the future.
|
2019-12-06 22:12:44 +08:00
|
|
|
|
2020-01-03 11:47:04 +08:00
|
|
|
Example of a type that implements the Handler interface.
|
2019-12-06 22:12:44 +08:00
|
|
|
type TaskHandler struct {
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
|
2020-02-12 13:59:46 +08:00
|
|
|
func (h *TaskHandler) ProcessTask(ctx context.Context, task *asynq.Task) error {
|
2019-12-06 22:12:44 +08:00
|
|
|
switch task.Type {
|
2021-03-21 04:42:13 +08:00
|
|
|
case "example":
|
|
|
|
var data ExamplePayload
|
|
|
|
if err := json.Unmarshal(task.Payload(), &data); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// perform task with the data
|
|
|
|
|
2019-12-06 22:12:44 +08:00
|
|
|
default:
|
2020-01-15 13:19:06 +08:00
|
|
|
return fmt.Errorf("unexpected task type %q", task.Type)
|
2019-12-06 22:12:44 +08:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
package asynq
|