You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

72 lines
1.7 KiB

  1. package main
  2. import (
  3. "github.com/mikespook/gearman-go/worker"
  4. "github.com/mikespook/golib/signal"
  5. "log"
  6. "os"
  7. "strings"
  8. "time"
  9. )
  10. func ToUpper(job worker.Job) ([]byte, error) {
  11. log.Printf("ToUpper: Data=[%s]\n", job.Data())
  12. data := []byte(strings.ToUpper(string(job.Data())))
  13. return data, nil
  14. }
  15. func ToUpperDelay10(job worker.Job) ([]byte, error) {
  16. log.Printf("ToUpper: Data=[%s]\n", job.Data())
  17. time.Sleep(10 * time.Second)
  18. data := []byte(strings.ToUpper(string(job.Data())))
  19. return data, nil
  20. }
  21. func Foobar(job worker.Job) ([]byte, error) {
  22. log.Printf("Foobar: Data=[%s]\n", job.Data())
  23. for i := 0; i < 10; i++ {
  24. job.SendWarning([]byte{byte(i)})
  25. job.SendData([]byte{byte(i)})
  26. job.UpdateStatus(i+1, 100)
  27. }
  28. return job.Data(), nil
  29. }
  30. func main() {
  31. log.Println("Starting ...")
  32. defer log.Println("Shutdown complete!")
  33. w := worker.New(worker.Unlimited)
  34. defer w.Close()
  35. w.ErrorHandler = func(e error) {
  36. log.Println(e)
  37. if e == worker.ErrLostConn {
  38. proc, err := os.FindProcess(os.Getpid())
  39. if err != nil {
  40. log.Println(err)
  41. }
  42. if err := proc.Signal(os.Interrupt); err != nil {
  43. log.Println(err)
  44. }
  45. }
  46. }
  47. w.JobHandler = func(job worker.Job) error {
  48. log.Printf("Data=%s\n", job.Data())
  49. return nil
  50. }
  51. w.AddServer("tcp4", "127.0.0.1:4730")
  52. w.AddFunc("Foobar", Foobar, worker.Unlimited)
  53. w.AddFunc("ToUpper", ToUpper, worker.Unlimited)
  54. w.AddFunc("ToUpperTimeOut5", ToUpperDelay10, 5)
  55. w.AddFunc("ToUpperTimeOut20", ToUpperDelay10, 20)
  56. w.AddFunc("SysInfo", worker.SysInfo, worker.Unlimited)
  57. w.AddFunc("MemInfo", worker.MemInfo, worker.Unlimited)
  58. if err := w.Ready(); err != nil {
  59. log.Fatal(err)
  60. return
  61. }
  62. go w.Work()
  63. sh := signal.NewHandler()
  64. sh.Bind(os.Interrupt, func() bool { return true })
  65. sh.Loop()
  66. }