Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

119 рядки
2.6 KiB

  1. package gearman
  2. import (
  3. "os"
  4. "net"
  5. "log"
  6. )
  7. type Client struct {
  8. conn net.Conn
  9. running bool
  10. JobQueue chan *ClientJob
  11. ErrQueue chan os.Error
  12. }
  13. func NewClient() (client * Client){
  14. client = &Client{running:false,
  15. JobQueue:make(chan *ClientJob, QUEUE_CAP),
  16. ErrQueue:make(chan os.Error, QUEUE_CAP),}
  17. return
  18. }
  19. func (client *Client) AddServer(addr string) (err os.Error) {
  20. conn, err := net.Dial(TCP, addr)
  21. if err != nil {
  22. return
  23. }
  24. client.conn = conn
  25. go client.work()
  26. return
  27. }
  28. func (client *Client) work() {
  29. OUT: for client.running {
  30. var rel []byte
  31. for {
  32. buf := make([]byte, 2048)
  33. n, err := client.conn.Read(buf)
  34. if err != nil {
  35. if err == os.EOF && n == 0 {
  36. break
  37. }
  38. client.ErrQueue <- err
  39. continue OUT
  40. }
  41. rel = append(rel, buf[0: n] ...)
  42. }
  43. job, err := DecodeClientJob(rel)
  44. if err != nil {
  45. client.ErrQueue <- err
  46. } else {
  47. switch(job.dataType) {
  48. case ERROR:
  49. _, err := getError(job.Data)
  50. client.ErrQueue <- err
  51. case ECHO_RES:
  52. client.JobQueue <- job
  53. }
  54. }
  55. }
  56. }
  57. func (client *Client) Do(funcname string, data []byte, flag byte) (err os.Error) {
  58. return
  59. }
  60. func (client *Client) Echo(data []byte) (err os.Error) {
  61. job := NewClientJob(REQ, ECHO_REQ, data)
  62. return client.WriteJob(job)
  63. }
  64. func (client *Client) LastResult() (job *ClientJob) {
  65. if l := len(client.JobQueue); l != 1 {
  66. if l == 0 {
  67. return
  68. }
  69. for i := 0; i < l - 1; i ++ {
  70. <-client.JobQueue
  71. }
  72. }
  73. return <-client.JobQueue
  74. }
  75. func (client *Client) LastError() (err os.Error) {
  76. if l := len(client.ErrQueue); l != 1 {
  77. if l == 0 {
  78. return
  79. }
  80. for i := 0; i < l - 1; i ++ {
  81. <-client.ErrQueue
  82. }
  83. }
  84. return <-client.ErrQueue
  85. }
  86. func (client *Client) WriteJob(job *ClientJob) (err os.Error) {
  87. return client.Write(job.Encode())
  88. }
  89. func (client *Client) Write(buf []byte) (err os.Error) {
  90. log.Println(buf)
  91. var n int
  92. for i := 0; i < len(buf); i += n {
  93. n, err = client.conn.Write(buf[i:])
  94. if err != nil {
  95. return
  96. }
  97. }
  98. return
  99. }
  100. func (client *Client) Close() (err os.Error) {
  101. client.running = false
  102. err = client.conn.Close()
  103. close(client.JobQueue)
  104. close(client.ErrQueue)
  105. return
  106. }