worker.go 898 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package backends
  2. import (
  3. "errors"
  4. "fmt"
  5. "runtime/debug"
  6. )
  7. type Worker struct{}
  8. func (w *Worker) saveMailWorker(saveMailChan chan *savePayload, p Processor, workerId int) {
  9. defer func() {
  10. if r := recover(); r != nil {
  11. // recover form closed channel
  12. fmt.Println("Recovered in f", r, string(debug.Stack()))
  13. Log().Error("Recovered form panic:", r, string(debug.Stack()))
  14. }
  15. // close any connections / files
  16. Service.Shutdown()
  17. }()
  18. Log().Infof("Save mail worker started (#%d)", workerId)
  19. for {
  20. payload := <-saveMailChan
  21. if payload == nil {
  22. Log().Debug("No more saveMailChan payload")
  23. return
  24. }
  25. // process the email here
  26. result, _ := p.Process(payload.mail)
  27. // if all good
  28. if result.Code() < 300 {
  29. payload.savedNotify <- &saveStatus{nil, payload.mail.Hashes[0]}
  30. } else {
  31. payload.savedNotify <- &saveStatus{errors.New(result.String()), ""}
  32. }
  33. }
  34. }