@@ -9,6 +9,7 @@ import ( | |||
"io" | |||
"net" | |||
"sync" | |||
"fmt" | |||
) | |||
/* | |||
@@ -114,6 +115,7 @@ func (client *Client) readLoop() { | |||
client.err(err) | |||
continue | |||
} | |||
fmt.Printf("[%X]", data) | |||
client.in <- data | |||
} | |||
close(client.in) | |||
@@ -191,10 +193,6 @@ func (client *Client) handleInner(key string, resp *Response) { | |||
// Internal do | |||
func (client *Client) do(funcname string, data []byte, | |||
flag uint32) (handle string, err error) { | |||
id := IdGen.Id() | |||
req := getJob(id, []byte(funcname), data) | |||
req.DataType = flag | |||
client.write(req) | |||
var wg sync.WaitGroup | |||
wg.Add(1) | |||
client.mutex.RLock() | |||
@@ -208,6 +206,10 @@ func (client *Client) do(funcname string, data []byte, | |||
} | |||
handle = resp.Handle | |||
}) | |||
id := IdGen.Id() | |||
req := getJob(id, []byte(funcname), data) | |||
req.DataType = flag | |||
client.write(req) | |||
wg.Wait() | |||
return | |||
} | |||
@@ -260,10 +262,6 @@ func (client *Client) DoBg(funcname string, data []byte, | |||
// Get job status from job server. | |||
// !!!Not fully tested.!!! | |||
func (client *Client) Status(handle string) (status *Status, err error) { | |||
req := getRequest() | |||
req.DataType = GET_STATUS | |||
req.Data = []byte(handle) | |||
client.write(req) | |||
var wg sync.WaitGroup | |||
wg.Add(1) | |||
client.mutex.Lock() | |||
@@ -277,25 +275,27 @@ func (client *Client) Status(handle string) (status *Status, err error) { | |||
client.err(err) | |||
} | |||
}) | |||
req := getRequest() | |||
req.DataType = GET_STATUS | |||
req.Data = []byte(handle) | |||
client.write(req) | |||
wg.Wait() | |||
return | |||
} | |||
// Send a something out, get the samething back. | |||
func (client *Client) Echo(data []byte) (echo []byte, err error) { | |||
req := getRequest() | |||
req.DataType = ECHO_REQ | |||
req.Data = data | |||
client.write(req) | |||
var wg sync.WaitGroup | |||
wg.Add(1) | |||
client.mutex.Lock() | |||
client.lastcall = "e" | |||
client.innerHandler["e"] = ResponseHandler(func(resp *Response) { | |||
defer wg.Done() | |||
defer client.mutex.Unlock() | |||
echo = resp.Data | |||
}) | |||
req := getRequest() | |||
req.DataType = ECHO_REQ | |||
req.Data = data | |||
client.write(req) | |||
client.lastcall = "e" | |||
wg.Wait() | |||
return | |||
} | |||
@@ -22,30 +22,30 @@ const ( | |||
RES_STR = "\x00RES" | |||
// package data type | |||
CAN_DO = 1 | |||
CANT_DO = 2 | |||
RESET_ABILITIES = 3 | |||
PRE_SLEEP = 4 | |||
NOOP = 6 | |||
JOB_CREATED = 8 | |||
GRAB_JOB = 9 | |||
NO_JOB = 10 | |||
JOB_ASSIGN = 11 | |||
WORK_STATUS = 12 | |||
WORK_COMPLETE = 13 | |||
WORK_FAIL = 14 | |||
GET_STATUS = 15 | |||
ECHO_REQ = 16 | |||
ECHO_RES = 17 | |||
ERROR = 19 | |||
STATUS_RES = 20 | |||
SET_CLIENT_ID = 22 | |||
CAN_DO_TIMEOUT = 23 | |||
WORK_EXCEPTION = 25 | |||
WORK_DATA = 28 | |||
WORK_WARNING = 29 | |||
GRAB_JOB_UNIQ = 30 | |||
JOB_ASSIGN_UNIQ = 31 | |||
CAN_DO = 0x1 | |||
CANT_DO = 0x2 | |||
RESET_ABILITIES = 0x3 | |||
PRE_SLEEP = 0x4 | |||
NOOP = 0x6 | |||
JOB_CREATED = 0x8 | |||
GRAB_JOB = 0x9 | |||
NO_JOB = 0xa | |||
JOB_ASSIGN = 0xb | |||
WORK_STATUS = 0xc | |||
WORK_COMPLETE = 0xd | |||
WORK_FAIL = 0xe | |||
GET_STATUS = 0xf | |||
ECHO_REQ = 0x10 | |||
ECHO_RES = 0x11 | |||
ERROR = 0x13 | |||
STATUS_RES = 0x14 | |||
SET_CLIENT_ID = 0x16 | |||
CAN_DO_TIMEOUT = 0x17 | |||
WORK_EXCEPTION = 0x19 | |||
WORK_DATA = 0x1c | |||
WORK_WARNING = 0x1d | |||
GRAB_JOB_UNIQ = 0x1e | |||
JOB_ASSIGN_UNIQ = 0x1f | |||
SUBMIT_JOB = 7 | |||
SUBMIT_JOB_BG = 18 | |||
@@ -3,7 +3,6 @@ package main | |||
import ( | |||
"log" | |||
"sync" | |||
"time" | |||
"github.com/mikespook/gearman-go/client" | |||
) | |||
@@ -14,29 +13,32 @@ func main() { | |||
// by implementing IdGenerator interface. | |||
// client.IdGen = client.NewAutoIncId() | |||
c, err := client.New("127.0.0.1:4730") | |||
c, err := client.New("tcp4", "127.0.0.1:4730") | |||
if err != nil { | |||
log.Fatalln(err) | |||
} | |||
defer c.Close() | |||
c.ErrHandler = func(e error) { | |||
c.ErrorHandler = func(e error) { | |||
log.Println(e) | |||
} | |||
echo := []byte("Hello\x00 world") | |||
wg.Add(1) | |||
echomsg, err := c.Echo(echo, time.Second) | |||
echomsg, err := c.Echo(echo) | |||
if err != nil { | |||
log.Fatalln(err) | |||
} | |||
log.Println(string(echomsg)) | |||
wg.Done() | |||
jobHandler := func(job *client.Job) { | |||
jobHandler := func(job *client.Response) { | |||
log.Printf("%s", job.Data) | |||
wg.Done() | |||
} | |||
handle := c.Do("ToUpper", echo, client.JOB_NORMAL, jobHandler) | |||
handle, err := c.Do("ToUpper", echo, client.JOB_NORMAL, jobHandler) | |||
if err != nil { | |||
log.Fatalln(err) | |||
} | |||
wg.Add(1) | |||
status, err := c.Status(handle, time.Second) | |||
status, err := c.Status(handle) | |||
if err != nil { | |||
log.Fatalln(err) | |||
} | |||