An asynchronous job execution system based on Redis
Get the package
$ go get github.com/wang502/gores/gores
Import the package
import "github.com/wang502/gores/gores"
Add a config.json in your project folder
{ "REDISURL": "127.0.0.1:6379", "REDIS_PW": "mypassword", "BLPOP_MAX_BLOCK_TIME" : 1, "MAX_WORKERS": 2, "Queues": ["queue1", "queue2"], "DispatcherTimeout": 5, "WorkerTimeout": 5 }
127.0.0.1:6379
Initialize config
configPath := flag.String("c", "config.json", "path to configuration file") flag.Parse() config, err := gores.InitConfig(*configPath)
An item is a Go map. It is required to have several keys:
resq := gores.NewResQ(config) item := map[string]interface{}{ "Name": "Rectangle", "Queue": "TestJob", "Args": map[string]interface{}{ "Length": 10, "Width": 10, }, "Enqueue_timestamp": time.Now().Unix(), } err = resq.Enqueue(item) if err != nil { log.Fatalf("ERROR Enqueue item to ResQ") }
$ go run main.go -c ./config.json -o produce
package tasks // task for item with 'Name' = 'Rectangle' // calculating the area of an rectangle by multiplying Length with Width func CalculateArea(args map[string]interface{}) error { var err error length := args["Length"] width := args["Width"] if length == nil || width == nil { err = errors.New("Map has no required attributes") return err } fmt.Printf("The area is %d/n", int(length.(float64)) * int(width.(float64))) return err }
tasks := map[string]interface{}{ "Item": tasks.PrintItem, "Rectangle": tasks.CalculateArea, } gores.Launch(config, &tasks)
$ go run main.go -c ./config.json -o consume
The output will be:
The rectangle area is 100
resq := gores.NewResQ(config) if resq == nil { log.Fatalf("resq is nil") } info := resq.Info() for k, v := range info { switch v.(type) { case string: fmt.Printf("%s : %s/n", k, v) case int: fmt.Printf("%s : %d/n", k, v) case int64: fmt.Printf("%s : %d/n", k, v) } }
The output will be:
Gores Info: queues : 2 workers : 0 failed : 0 host : 127.0.0.1:6379 pending : 0 processed : 1
Please feel free to suggest new features. Also open to pull request!