|
- package gearman
-
- import (
- "net"
- "os"
- // "log"
- )
-
- type jobClient struct {
- conn net.Conn
- worker *Worker
- running bool
- }
-
- func newJobClient(addr string, worker *Worker) (jobclient *jobClient, err os.Error) {
- conn, err := net.Dial(TCP, addr)
- if err != nil {
- return nil, err
- }
- jobclient = &jobClient{conn:conn, worker:worker, running:true}
- return jobclient, err
- }
-
- func (client *jobClient) Work() {
- noop := true
- OUT: for client.running {
- // grab job
- if noop {
- client.WriteJob(NewWorkerJob(REQ, GRAB_JOB, nil))
- }
- var rel []byte
- for {
- buf := make([]byte, 2048)
- n, err := client.conn.Read(buf)
- if err != nil {
- if err == os.EOF && n == 0 {
- break
- }
- client.worker.ErrQueue <- err
- continue OUT
- }
- rel = append(rel, buf[0: n] ...)
- }
- job, err := DecodeWorkerJob(rel)
- if err != nil {
- client.worker.ErrQueue <- err
- continue
- } else {
- switch(job.dataType) {
- case NOOP:
- noop = true
- case NO_JOB:
- noop = false
- client.WriteJob(NewWorkerJob(REQ, PRE_SLEEP, nil))
- case ECHO_RES, JOB_ASSIGN_UNIQ, JOB_ASSIGN:
- job.client = client
- client.worker.incoming <- job
- }
- }
- }
- return
- }
-
- func (client *jobClient) WriteJob(job *WorkerJob) (err os.Error) {
- return client.Write(job.Encode())
- }
-
- func (client *jobClient) Write(buf []byte) (err os.Error) {
- var n int
- for i := 0; i < len(buf); i += n {
- n, err = client.conn.Write(buf[i:])
- if err != nil {
- return err
- }
- }
- return
- }
-
- func (client *jobClient) Close() (err os.Error) {
- client.running = false
- err = client.conn.Close()
- return
- }
|