forked from yuxh/gearman-go
		
	replease ErrQueue to ErrFunc, add a limitation to executing job
This commit is contained in:
		
							parent
							
								
									f7896651a4
								
							
						
					
					
						commit
						e4172dec11
					
				@ -16,7 +16,10 @@ func ToUpper(job *worker.WorkerJob) ([]byte, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
    w := worker.New()
 | 
			
		||||
    w := worker.New(worker.Unlimit)
 | 
			
		||||
    w.ErrFunc = func(e error) {
 | 
			
		||||
        log.Println(e)
 | 
			
		||||
    }
 | 
			
		||||
    w.AddServer("127.0.0.1:4730")
 | 
			
		||||
    w.AddFunction("ToUpper", ToUpper, 0)
 | 
			
		||||
    w.AddFunction("ToUpperTimeOut5", ToUpper, 5)
 | 
			
		||||
@ -44,6 +47,7 @@ func main() {
 | 
			
		||||
                }
 | 
			
		||||
                log.Println(string(job.Data))
 | 
			
		||||
            case "quit":
 | 
			
		||||
                os.Exit(0)
 | 
			
		||||
                return
 | 
			
		||||
            case "result":
 | 
			
		||||
                job := <-w.JobQueue
 | 
			
		||||
 | 
			
		||||
@ -25,28 +25,28 @@ usage:
 | 
			
		||||
type Client struct {
 | 
			
		||||
    mutex    sync.Mutex
 | 
			
		||||
    conn     net.Conn
 | 
			
		||||
    JobQueue chan *ClientJob
 | 
			
		||||
    incoming chan []byte
 | 
			
		||||
 | 
			
		||||
    JobQueue chan *ClientJob
 | 
			
		||||
    UId      uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create a new client.
 | 
			
		||||
func New() (client *Client) {
 | 
			
		||||
    client = &Client{JobQueue: make(chan *ClientJob, gearman.QUEUE_CAP),
 | 
			
		||||
    return &Client{
 | 
			
		||||
        JobQueue: make(chan *ClientJob, gearman.QUEUE_CAP),
 | 
			
		||||
        incoming: make(chan []byte, gearman.QUEUE_CAP),
 | 
			
		||||
        UId:1}
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Add a server.
 | 
			
		||||
// In this version, one client connect to one job server.
 | 
			
		||||
// Sample is better. Plz do the load balancing by your self.
 | 
			
		||||
func (client *Client) AddServer(addr string) (err error) {
 | 
			
		||||
    conn, err := net.Dial(gearman.TCP, addr)
 | 
			
		||||
    client.conn, err = net.Dial(gearman.TCP, addr)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
    client.conn = conn
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -82,12 +82,12 @@ func (agent *jobAgent) Work() {
 | 
			
		||||
        }
 | 
			
		||||
        rel, err := agent.read()
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            agent.worker.ErrQueue <- err
 | 
			
		||||
            agent.worker.err(err)
 | 
			
		||||
            continue
 | 
			
		||||
        }
 | 
			
		||||
        job, err := DecodeWorkerJob(rel)
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            agent.worker.ErrQueue <- err
 | 
			
		||||
            agent.worker.err(err)
 | 
			
		||||
            continue
 | 
			
		||||
        } else {
 | 
			
		||||
            switch job.DataType {
 | 
			
		||||
 | 
			
		||||
@ -10,20 +10,27 @@ import (
 | 
			
		||||
    "sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
    Unlimit = 0
 | 
			
		||||
    OneByOne = 1
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// The definition of the callback function.
 | 
			
		||||
type JobFunction func(job *WorkerJob) ([]byte, error)
 | 
			
		||||
 | 
			
		||||
// Map for added function.
 | 
			
		||||
type JobFunctionMap map[string]JobFunction
 | 
			
		||||
 | 
			
		||||
// Error Function
 | 
			
		||||
type ErrFunc func(e error)
 | 
			
		||||
/*
 | 
			
		||||
Worker side api for gearman.
 | 
			
		||||
 | 
			
		||||
usage:
 | 
			
		||||
    worker = NewWorker()
 | 
			
		||||
    worker.AddFunction("foobar", foobar)
 | 
			
		||||
    worker.AddServer("127.0.0.1:4730")
 | 
			
		||||
    worker.Work() // Enter the worker's main loop
 | 
			
		||||
    w = worker.New(worker.Unlimit)
 | 
			
		||||
    w.AddFunction("foobar", foobar)
 | 
			
		||||
    w.AddServer("127.0.0.1:4730")
 | 
			
		||||
    w.Work() // Enter the worker's main loop
 | 
			
		||||
 | 
			
		||||
The definition of the callback function 'foobar' should suit for the type 'JobFunction'.
 | 
			
		||||
It looks like this:
 | 
			
		||||
@ -37,16 +44,20 @@ func foobar(job *WorkerJob) (data []byte, err os.Error) {
 | 
			
		||||
type Worker struct {
 | 
			
		||||
    clients   []*jobAgent
 | 
			
		||||
    functions JobFunctionMap
 | 
			
		||||
 | 
			
		||||
    running  bool
 | 
			
		||||
    incoming chan *WorkerJob
 | 
			
		||||
    mutex    sync.Mutex
 | 
			
		||||
    limit chan bool
 | 
			
		||||
 | 
			
		||||
    JobQueue chan *WorkerJob
 | 
			
		||||
    ErrQueue chan error
 | 
			
		||||
 | 
			
		||||
    // assign a ErrFunc to handle errors
 | 
			
		||||
    // Must assign befor AddServer
 | 
			
		||||
    ErrFunc ErrFunc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get a new worker
 | 
			
		||||
func New() (worker *Worker) {
 | 
			
		||||
func New(l int) (worker *Worker) {
 | 
			
		||||
    worker = &Worker{
 | 
			
		||||
        // job server list
 | 
			
		||||
        clients: make([]*jobAgent, 0, gearman.WORKER_SERVER_CAP),
 | 
			
		||||
@ -54,12 +65,24 @@ func New() (worker *Worker) {
 | 
			
		||||
        functions: make(JobFunctionMap),
 | 
			
		||||
        incoming:  make(chan *WorkerJob, gearman.QUEUE_CAP),
 | 
			
		||||
        JobQueue:  make(chan *WorkerJob, gearman.QUEUE_CAP),
 | 
			
		||||
        ErrQueue:  make(chan error, gearman.QUEUE_CAP),
 | 
			
		||||
        running:   true,
 | 
			
		||||
    }
 | 
			
		||||
    if l != Unlimit {
 | 
			
		||||
        worker.limit = make(chan bool, l)
 | 
			
		||||
        for i := 0; i < l; i ++ {
 | 
			
		||||
            worker.limit <- true
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 
 | 
			
		||||
func (worker *Worker)err(e error) {
 | 
			
		||||
    if worker.ErrFunc != nil {
 | 
			
		||||
        worker.ErrFunc(e)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Add a server. The addr should be 'host:port' format.
 | 
			
		||||
// The connection is established at this time.
 | 
			
		||||
func (worker *Worker) AddServer(addr string) (err error) {
 | 
			
		||||
@ -141,11 +164,11 @@ func (worker *Worker) Work() {
 | 
			
		||||
                // do nothing
 | 
			
		||||
            case gearman.ERROR:
 | 
			
		||||
                _, err := gearman.GetError(job.Data)
 | 
			
		||||
                worker.ErrQueue <- err
 | 
			
		||||
                worker.err(err)
 | 
			
		||||
            case gearman.JOB_ASSIGN, gearman.JOB_ASSIGN_UNIQ:
 | 
			
		||||
                go func() {
 | 
			
		||||
                    if err := worker.exec(job); err != nil {
 | 
			
		||||
                        worker.ErrQueue <- err
 | 
			
		||||
                        worker.err(err)
 | 
			
		||||
                    }
 | 
			
		||||
                }()
 | 
			
		||||
            default:
 | 
			
		||||
@ -217,6 +240,12 @@ func (worker *Worker) SetId(id string) (err error) {
 | 
			
		||||
 | 
			
		||||
// Execute the job. And send back the result.
 | 
			
		||||
func (worker *Worker) exec(job *WorkerJob) (err error) {
 | 
			
		||||
    if worker.limit != nil {
 | 
			
		||||
        <- worker.limit
 | 
			
		||||
        defer func() {
 | 
			
		||||
            worker.limit <- true
 | 
			
		||||
        }()
 | 
			
		||||
    }
 | 
			
		||||
    var limit int
 | 
			
		||||
    if job.DataType == gearman.JOB_ASSIGN {
 | 
			
		||||
        limit = 3
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user