package main import ( "encoding/json" "fmt" "log" "os" "strings" "github.com/go-redis/redis" ) type Rpc struct { Fun string `json:"fun"` Args []string `json:"args"` } func main() { host, ok := os.LookupEnv("REDIS_HOST") if !ok { log.Fatal("Please set REDIS_HOST environment variable") } 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 }) 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) } if err := tasks[call.Fun](call.Args); err != nil { log.Println(err) continue } else { 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) } } } } }