func run(messages []sqs.Message) { numMessages := len(messages) log.Debugln("worker: Received", numMessages, " tasks") var wg sync.WaitGroup wg.Add(numMessages) for i := range messages { go func(m *sqs.Message) { // launch goroutine defer func() { if err := recover(); err != nil { trace := make([]byte, 2048) runtime.Stack(trace, true) log.Criticalln("worker:", err, string(trace)) } wg.Done() }() if err := handleMessage(m); err != nil { log.Errorln("worker:", err) } }(&messages[i]) } wg.Wait() }
// Task runner daemon loop func taskRunner() { time.Sleep(time.Second * 10) log.Debugln("worker: Start polling") for { resp, err := queue.ReceiveMessage(batchSize) if err != nil { log.Errorln(err) continue } messages := resp.Messages if len(messages) > 0 { run(messages) } else { time.Sleep(time.Millisecond * 500) } } log.Debugln("worker: Leaving polling") }
func handleMessage(m *sqs.Message) error { ts := new(TaskSchedule) if err := json.Unmarshal([]byte(m.Body), ts); err != nil { return err } t, ok := tasks[ts.Name] if !ok { return errors.New("Unknow task: " + ts.Name) } log.Debugln("worker: call:", ts.Name) t.call(ts.Params...) _, err := queue.DeleteMessage(m) return err }
func main() { app := happyngine.NewAPI() // Setup seed rand.Seed(time.Now().UnixNano()) // Setup Origin if origin := env.Get("ALLOW_ORIGIN"); len(origin) > 0 { app.Headers["Access-Control-Allow-Origin"] = origin } if cacheControl := env.Get("CACHE_CONTROL"); len(cacheControl) > 0 { app.Headers["Cache-Control"] = cacheControl } // Register actions app.AddRoute("GET", "/:bucket/:file", newGetFileAction) // Setup custuom 404 handler app.Error404Handler = func(ctx *happyngine.Context, err interface{}) { ctx.Send(http.StatusNotFound, `not found 404`) } // Setup custuom panic handler app.PanicHandler = func(ctx *happyngine.Context, err interface{}) { ctx.Send(500, `{"error":"internal_error"}`) trace := make([]byte, 1024) runtime.Stack(trace, true) ctx.Criticalln(err, string(trace)) } log.Debugln("Running...") if err := app.Run(":8080"); err != nil { log.Criticalln("app.Run:", err) } }