package main import ( "encoding/json" "errors" "fmt" "log" "os" "strings" "github.com/go-redis/redis" ) type Rpc struct { Fun string `json:"fun"` Args []string `json:"args"` } func get_redis_client() (*redis.Client, error) { host, ok := os.LookupEnv("REDIS_HOST") if !ok { err := errors.New("Please set REDIS_HOST environment variable") return nil, err } var network = "tcp" if strings.Contains(host, string(os.PathSeparator)) { network = "unix" } else { host += ":6379" } client := redis.NewClient(&redis.Options{ Network: network, Addr: host, Password: "", // no password set DB: 0, // use default DB }) return client, nil } func main() { log.SetOutput(os.Stdout) client, err := get_redis_client() if err != nil { log.Fatal(err) } for { if result, err := client.BLPop(0, "tasks").Result(); err != nil { log.Println(err) } else { var call Rpc err := json.Unmarshal([]byte(result[1]), &call) if err != nil { log.Println(err) } log.Printf("Running %s with %v\n", call.Fun, call.Args) if err := tasks[call.Fun](call.Args); err != nil { log.Println(err) log.Printf("'%s' did not complete\n", call.Fun) continue } else { log.Printf("'%s' completed\n", call.Fun) if call.Fun == "build_portfolios" { call.Fun = "build_scenarios" } else if call.Fun == "build_scenarios" { call.Fun = "generate_scenarios" call.Args = call.Args[:len(call.Args)-1] } else { continue } var call_json []byte call_json, err := json.Marshal(call) if err != nil { fmt.Println(err) } if err := client.RPush("tasks", call_json).Err(); err != nil { log.Println(err) } } } } }