1
0

buffered_worker.go 918 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package honeybadger
  2. import "fmt"
  3. var (
  4. errWorkerOverflow = fmt.Errorf("The worker is full; this envelope will be dropped.")
  5. )
  6. func newBufferedWorker(config *Configuration) *bufferedWorker {
  7. worker := &bufferedWorker{ch: make(chan envelope, 100)}
  8. go func() {
  9. for w := range worker.ch {
  10. work := func() error {
  11. defer func() {
  12. if err := recover(); err != nil {
  13. config.Logger.Printf("worker recovered from panic: %v\n", err)
  14. }
  15. }()
  16. return w()
  17. }
  18. if err := work(); err != nil {
  19. config.Logger.Printf("worker processing error: %v\n", err)
  20. }
  21. }
  22. }()
  23. return worker
  24. }
  25. type bufferedWorker struct {
  26. ch chan envelope
  27. }
  28. func (w *bufferedWorker) Push(work envelope) error {
  29. select {
  30. case w.ch <- work:
  31. return nil
  32. default:
  33. return errWorkerOverflow
  34. }
  35. }
  36. func (w *bufferedWorker) Flush() {
  37. ch := make(chan bool)
  38. w.ch <- func() error {
  39. ch <- true
  40. return nil
  41. }
  42. <-ch
  43. }