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.
 
 
 

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