forked from yuxh/gearman-go
		
	Something should not display in documents, disabled.
This commit is contained in:
		
							parent
							
								
									18791d0490
								
							
						
					
					
						commit
						59941371fb
					
				@ -21,7 +21,7 @@ func newAgent(net, addr string, worker *Worker) (a *agent, err error) {
 | 
			
		||||
		net:    net,
 | 
			
		||||
		addr:   addr,
 | 
			
		||||
		worker: worker,
 | 
			
		||||
		in:     make(chan []byte, QUEUE_SIZE),
 | 
			
		||||
		in:     make(chan []byte, queueSize),
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
@ -43,7 +43,7 @@ func (a *agent) work() {
 | 
			
		||||
	var err error
 | 
			
		||||
	var data, leftdata []byte
 | 
			
		||||
	for {
 | 
			
		||||
		if data, err = a.read(BUFFER_SIZE); err != nil {
 | 
			
		||||
		if data, err = a.read(bufferSize); err != nil {
 | 
			
		||||
			a.worker.err(err)
 | 
			
		||||
			if err == ErrLostConn {
 | 
			
		||||
				break
 | 
			
		||||
@ -60,7 +60,7 @@ func (a *agent) work() {
 | 
			
		||||
		if len(leftdata) > 0 { // some data left for processing
 | 
			
		||||
			data = append(leftdata, data...)
 | 
			
		||||
		}
 | 
			
		||||
		if len(data) < MIN_PACKET_LEN { // not enough data
 | 
			
		||||
		if len(data) < minPacketLength { // not enough data
 | 
			
		||||
			leftdata = data
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
@ -90,7 +90,7 @@ func (a *agent) Grab() {
 | 
			
		||||
	a.Lock()
 | 
			
		||||
	defer a.Unlock()
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	outpack.dataType = GRAB_JOB_UNIQ
 | 
			
		||||
	outpack.dataType = dtGrabJobUniq
 | 
			
		||||
	a.write(outpack)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -98,16 +98,16 @@ func (a *agent) PreSleep() {
 | 
			
		||||
	a.Lock()
 | 
			
		||||
	defer a.Unlock()
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	outpack.dataType = PRE_SLEEP
 | 
			
		||||
	outpack.dataType = dtPreSleep
 | 
			
		||||
	a.write(outpack)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// read length bytes from the socket
 | 
			
		||||
func (a *agent) read(length int) (data []byte, err error) {
 | 
			
		||||
	n := 0
 | 
			
		||||
	buf := getBuffer(BUFFER_SIZE)
 | 
			
		||||
	buf := getBuffer(bufferSize)
 | 
			
		||||
	// read until data can be unpacked
 | 
			
		||||
	for i := length; i > 0 || len(data) < MIN_PACKET_LEN; i -= n {
 | 
			
		||||
	for i := length; i > 0 || len(data) < minPacketLength; i -= n {
 | 
			
		||||
		if n, err = a.conn.Read(buf); err != nil {
 | 
			
		||||
			if err == io.EOF {
 | 
			
		||||
				err = ErrLostConn
 | 
			
		||||
@ -115,7 +115,7 @@ func (a *agent) read(length int) (data []byte, err error) {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		data = append(data, buf[0:n]...)
 | 
			
		||||
		if n < BUFFER_SIZE {
 | 
			
		||||
		if n < bufferSize {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -1,54 +1,47 @@
 | 
			
		||||
package worker
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	NETWORK = "tcp"
 | 
			
		||||
	Network = "tcp"
 | 
			
		||||
	// queue size
 | 
			
		||||
	QUEUE_SIZE = 8
 | 
			
		||||
	queueSize = 8
 | 
			
		||||
	// read buffer size
 | 
			
		||||
	BUFFER_SIZE = 1024
 | 
			
		||||
	bufferSize = 1024
 | 
			
		||||
	// min packet length
 | 
			
		||||
	MIN_PACKET_LEN = 12
 | 
			
		||||
	minPacketLength = 12
 | 
			
		||||
 | 
			
		||||
	// \x00REQ
 | 
			
		||||
	REQ     = 5391697
 | 
			
		||||
	REQ_STR = "\x00REQ"
 | 
			
		||||
	req     = 5391697
 | 
			
		||||
	reqStr = "\x00REQ"
 | 
			
		||||
	// \x00RES
 | 
			
		||||
	RES     = 5391699
 | 
			
		||||
	RES_STR = "\x00RES"
 | 
			
		||||
	res     = 5391699
 | 
			
		||||
	resStr = "\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
 | 
			
		||||
	ALL_YOURS       = 24
 | 
			
		||||
	WORK_EXCEPTION  = 25
 | 
			
		||||
	WORK_DATA       = 28
 | 
			
		||||
	WORK_WARNING    = 29
 | 
			
		||||
	GRAB_JOB_UNIQ   = 30
 | 
			
		||||
	JOB_ASSIGN_UNIQ = 31
 | 
			
		||||
 | 
			
		||||
	SUBMIT_JOB         = 7
 | 
			
		||||
	SUBMIT_JOB_BG      = 18
 | 
			
		||||
	SUBMIT_JOB_HIGH    = 21
 | 
			
		||||
	SUBMIT_JOB_HIGH_BG = 32
 | 
			
		||||
	SUBMIT_JOB_LOW     = 33
 | 
			
		||||
	SUBMIT_JOB_LOW_BG  = 34
 | 
			
		||||
	dtCanDo          = 1
 | 
			
		||||
	dtCantDo         = 2
 | 
			
		||||
	dtResetAbilities = 3
 | 
			
		||||
	dtPreSleep       = 4
 | 
			
		||||
	dtNoop            = 6
 | 
			
		||||
	dtJobCreated     = 8
 | 
			
		||||
	dtGrabJob        = 9
 | 
			
		||||
	dtNoJob          = 10
 | 
			
		||||
	dtJobAssign      = 11
 | 
			
		||||
	dtWorkStatus     = 12
 | 
			
		||||
	dtWorkComplete   = 13
 | 
			
		||||
	dtWorkFail       = 14
 | 
			
		||||
	dtGetStatus      = 15
 | 
			
		||||
	dtEchoReq        = 16
 | 
			
		||||
	dtEchoRes        = 17
 | 
			
		||||
	dtError           = 19
 | 
			
		||||
	dtStatusRes      = 20
 | 
			
		||||
	dtSetClientId   = 22
 | 
			
		||||
	dtCanDoTimeout  = 23
 | 
			
		||||
	dtAllYours       = 24
 | 
			
		||||
	dtWorkException  = 25
 | 
			
		||||
	dtWorkData       = 28
 | 
			
		||||
	dtWorkWarning    = 29
 | 
			
		||||
	dtGrabJobUniq   = 30
 | 
			
		||||
	dtJobAssignUniq = 31
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func getBuffer(l int) (buf []byte) {
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ var (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Extract the error message
 | 
			
		||||
func GetError(data []byte) (err error) {
 | 
			
		||||
func getError(data []byte) (err error) {
 | 
			
		||||
	rel := bytes.SplitN(data, []byte{'\x00'}, 2)
 | 
			
		||||
	if len(rel) != 2 {
 | 
			
		||||
		err = fmt.Errorf("Not a error data: %V", data)
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ func ExampleWorker() {
 | 
			
		||||
	w := worker.New(worker.Unlimited)
 | 
			
		||||
	defer w.Close()
 | 
			
		||||
	// Add a gearman job server
 | 
			
		||||
	if err := w.AddServer("tcp4", "127.0.0.1:4730"); err != nil {
 | 
			
		||||
	if err := w.AddServer(worker.NETWORK, "127.0.0.1:4730"); err != nil {
 | 
			
		||||
		fmt.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
@ -26,7 +26,7 @@ func ExampleWorker() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	// A custome handler, for handling other results, eg. ECHO, ERROR.
 | 
			
		||||
	// A custome handler, for handling other results, eg. ECHO, dtError.
 | 
			
		||||
	w.JobHandler = func(job worker.Job) error {
 | 
			
		||||
		if job.Err() == nil {
 | 
			
		||||
			fmt.Println(string(job.Data()))
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ type jobFunc struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Map for added function.
 | 
			
		||||
type JobFuncs map[string]*jobFunc
 | 
			
		||||
type jobFuncs map[string]*jobFunc
 | 
			
		||||
 | 
			
		||||
type systemInfo struct {
 | 
			
		||||
	GOOS, GOARCH, GOROOT, Version string
 | 
			
		||||
 | 
			
		||||
@ -25,8 +25,8 @@ func (inpack *inPack) Data() []byte {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (inpack *inPack) Err() error {
 | 
			
		||||
	if inpack.dataType == ERROR {
 | 
			
		||||
		return GetError(inpack.data)
 | 
			
		||||
	if inpack.dataType == dtError {
 | 
			
		||||
		return getError(inpack.data)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@ -35,7 +35,7 @@ func (inpack *inPack) Err() error {
 | 
			
		||||
// Using this in a job's executing.
 | 
			
		||||
func (inpack *inPack) SendData(data []byte) {
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	outpack.dataType = WORK_DATA
 | 
			
		||||
	outpack.dataType = dtWorkData
 | 
			
		||||
	hl := len(inpack.handle)
 | 
			
		||||
	l := hl + len(data) + 1
 | 
			
		||||
	outpack.data = getBuffer(l)
 | 
			
		||||
@ -46,7 +46,7 @@ func (inpack *inPack) SendData(data []byte) {
 | 
			
		||||
 | 
			
		||||
func (inpack *inPack) SendWarning(data []byte) {
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	outpack.dataType = WORK_WARNING
 | 
			
		||||
	outpack.dataType = dtWorkWarning
 | 
			
		||||
	hl := len(inpack.handle)
 | 
			
		||||
	l := hl + len(data) + 1
 | 
			
		||||
	outpack.data = getBuffer(l)
 | 
			
		||||
@ -61,7 +61,7 @@ func (inpack *inPack) UpdateStatus(numerator, denominator int) {
 | 
			
		||||
	n := []byte(strconv.Itoa(numerator))
 | 
			
		||||
	d := []byte(strconv.Itoa(denominator))
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	outpack.dataType = WORK_STATUS
 | 
			
		||||
	outpack.dataType = dtWorkStatus
 | 
			
		||||
	hl := len(inpack.handle)
 | 
			
		||||
	nl := len(n)
 | 
			
		||||
	dl := len(d)
 | 
			
		||||
@ -74,12 +74,12 @@ func (inpack *inPack) UpdateStatus(numerator, denominator int) {
 | 
			
		||||
 | 
			
		||||
// Decode job from byte slice
 | 
			
		||||
func decodeInPack(data []byte) (inpack *inPack, l int, err error) {
 | 
			
		||||
	if len(data) < MIN_PACKET_LEN { // valid package should not less 12 bytes
 | 
			
		||||
	if len(data) < minPacketLength { // valid package should not less 12 bytes
 | 
			
		||||
		err = fmt.Errorf("Invalid data: %V", data)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	dl := int(binary.BigEndian.Uint32(data[8:12]))
 | 
			
		||||
	dt := data[MIN_PACKET_LEN : dl+MIN_PACKET_LEN]
 | 
			
		||||
	dt := data[minPacketLength : dl+minPacketLength]
 | 
			
		||||
	if len(dt) != int(dl) { // length not equal
 | 
			
		||||
		err = fmt.Errorf("Invalid data: %V", data)
 | 
			
		||||
		return
 | 
			
		||||
@ -87,14 +87,14 @@ func decodeInPack(data []byte) (inpack *inPack, l int, err error) {
 | 
			
		||||
	inpack = getInPack()
 | 
			
		||||
	inpack.dataType = binary.BigEndian.Uint32(data[4:8])
 | 
			
		||||
	switch inpack.dataType {
 | 
			
		||||
	case JOB_ASSIGN:
 | 
			
		||||
	case dtJobAssign:
 | 
			
		||||
		s := bytes.SplitN(dt, []byte{'\x00'}, 3)
 | 
			
		||||
		if len(s) == 3 {
 | 
			
		||||
			inpack.handle = string(s[0])
 | 
			
		||||
			inpack.fn = string(s[1])
 | 
			
		||||
			inpack.data = s[2]
 | 
			
		||||
		}
 | 
			
		||||
	case JOB_ASSIGN_UNIQ:
 | 
			
		||||
	case dtJobAssignUniq:
 | 
			
		||||
		s := bytes.SplitN(dt, []byte{'\x00'}, 4)
 | 
			
		||||
		if len(s) == 4 {
 | 
			
		||||
			inpack.handle = string(s[0])
 | 
			
		||||
@ -105,6 +105,6 @@ func decodeInPack(data []byte) (inpack *inPack, l int, err error) {
 | 
			
		||||
	default:
 | 
			
		||||
		inpack.data = dt
 | 
			
		||||
	}
 | 
			
		||||
	l = dl + MIN_PACKET_LEN
 | 
			
		||||
	l = dl + minPacketLength
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -7,19 +7,19 @@ import (
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	inpackcases = map[uint32]map[string]string{
 | 
			
		||||
		NOOP: map[string]string{
 | 
			
		||||
		noop: map[string]string{
 | 
			
		||||
			"src": "\x00RES\x00\x00\x00\x06\x00\x00\x00\x00",
 | 
			
		||||
		},
 | 
			
		||||
		NO_JOB: map[string]string{
 | 
			
		||||
		noJob: map[string]string{
 | 
			
		||||
			"src": "\x00RES\x00\x00\x00\x0a\x00\x00\x00\x00",
 | 
			
		||||
		},
 | 
			
		||||
		JOB_ASSIGN: map[string]string{
 | 
			
		||||
		jobAssign: map[string]string{
 | 
			
		||||
			"src":    "\x00RES\x00\x00\x00\x0b\x00\x00\x00\x07a\x00b\x00xyz",
 | 
			
		||||
			"handle": "a",
 | 
			
		||||
			"fn":     "b",
 | 
			
		||||
			"data":   "xyz",
 | 
			
		||||
		},
 | 
			
		||||
		JOB_ASSIGN_UNIQ: map[string]string{
 | 
			
		||||
		jobAssign_UNIQ: map[string]string{
 | 
			
		||||
			"src":    "\x00RES\x00\x00\x00\x1F\x00\x00\x00\x09a\x00b\x00c\x00xyz",
 | 
			
		||||
			"handle": "a",
 | 
			
		||||
			"fn":     "b",
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ func getOutPack() (outpack *outPack) {
 | 
			
		||||
// Encode a job to byte slice
 | 
			
		||||
func (outpack *outPack) Encode() (data []byte) {
 | 
			
		||||
	var l int
 | 
			
		||||
	if outpack.dataType == WORK_FAIL {
 | 
			
		||||
	if outpack.dataType == dtWorkFail {
 | 
			
		||||
		l = len(outpack.handle)
 | 
			
		||||
	} else {
 | 
			
		||||
		l = len(outpack.data)
 | 
			
		||||
@ -27,20 +27,20 @@ func (outpack *outPack) Encode() (data []byte) {
 | 
			
		||||
			l += len(outpack.handle) + 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	data = getBuffer(l + MIN_PACKET_LEN)
 | 
			
		||||
	binary.BigEndian.PutUint32(data[:4], REQ)
 | 
			
		||||
	data = getBuffer(l + minPacketLength)
 | 
			
		||||
	binary.BigEndian.PutUint32(data[:4], req)
 | 
			
		||||
	binary.BigEndian.PutUint32(data[4:8], outpack.dataType)
 | 
			
		||||
	binary.BigEndian.PutUint32(data[8:MIN_PACKET_LEN], uint32(l))
 | 
			
		||||
	i := MIN_PACKET_LEN
 | 
			
		||||
	binary.BigEndian.PutUint32(data[8:minPacketLength], uint32(l))
 | 
			
		||||
	i := minPacketLength
 | 
			
		||||
	if outpack.handle != "" {
 | 
			
		||||
		hi := len(outpack.handle) + i
 | 
			
		||||
		copy(data[i:hi], []byte(outpack.handle))
 | 
			
		||||
		if outpack.dataType != WORK_FAIL {
 | 
			
		||||
		if outpack.dataType != dtWorkFail {
 | 
			
		||||
			data[hi] = '\x00'
 | 
			
		||||
		}
 | 
			
		||||
		i = hi + 1
 | 
			
		||||
	}
 | 
			
		||||
	if outpack.dataType != WORK_FAIL {
 | 
			
		||||
	if outpack.dataType != dtWorkFail {
 | 
			
		||||
		copy(data[i:], outpack.data)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
 | 
			
		||||
@ -7,22 +7,22 @@ import (
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	outpackcases = map[uint32]map[string]string{
 | 
			
		||||
		CAN_DO: map[string]string{
 | 
			
		||||
		canDo: map[string]string{
 | 
			
		||||
			"src":  "\x00REQ\x00\x00\x00\x01\x00\x00\x00\x01a",
 | 
			
		||||
			"data": "a",
 | 
			
		||||
		},
 | 
			
		||||
		CAN_DO_TIMEOUT: map[string]string{
 | 
			
		||||
		canDo_TIMEOUT: map[string]string{
 | 
			
		||||
			"src":  "\x00REQ\x00\x00\x00\x17\x00\x00\x00\x06a\x00\x00\x00\x00\x01",
 | 
			
		||||
			"data": "a\x00\x00\x00\x00\x01",
 | 
			
		||||
		},
 | 
			
		||||
		CANT_DO: map[string]string{
 | 
			
		||||
		cantDo: map[string]string{
 | 
			
		||||
			"src":  "\x00REQ\x00\x00\x00\x02\x00\x00\x00\x01a",
 | 
			
		||||
			"data": "a",
 | 
			
		||||
		},
 | 
			
		||||
		RESET_ABILITIES: map[string]string{
 | 
			
		||||
		resetAbilities: map[string]string{
 | 
			
		||||
			"src": "\x00REQ\x00\x00\x00\x03\x00\x00\x00\x00",
 | 
			
		||||
		},
 | 
			
		||||
		PRE_SLEEP: map[string]string{
 | 
			
		||||
		preSleep: map[string]string{
 | 
			
		||||
			"src": "\x00REQ\x00\x00\x00\x04\x00\x00\x00\x00",
 | 
			
		||||
		},
 | 
			
		||||
		GRAB_JOB: map[string]string{
 | 
			
		||||
@ -39,15 +39,15 @@ var (
 | 
			
		||||
			"src":  "\x00REQ\x00\x00\x00\x1D\x00\x00\x00\x03a\x00b",
 | 
			
		||||
			"data": "a\x00b",
 | 
			
		||||
		},
 | 
			
		||||
		WORK_STATUS: map[string]string{
 | 
			
		||||
		workStatus: map[string]string{
 | 
			
		||||
			"src":  "\x00REQ\x00\x00\x00\x0C\x00\x00\x00\x08a\x0050\x00100",
 | 
			
		||||
			"data": "a\x0050\x00100",
 | 
			
		||||
		},
 | 
			
		||||
		WORK_COMPLETE: map[string]string{
 | 
			
		||||
		workComplete: map[string]string{
 | 
			
		||||
			"src":  "\x00REQ\x00\x00\x00\x0D\x00\x00\x00\x03a\x00b",
 | 
			
		||||
			"data": "a\x00b",
 | 
			
		||||
		},
 | 
			
		||||
		WORK_FAIL: map[string]string{
 | 
			
		||||
		workFail: map[string]string{
 | 
			
		||||
			"src":    "\x00REQ\x00\x00\x00\x0E\x00\x00\x00\x01a",
 | 
			
		||||
			"handle": "a",
 | 
			
		||||
		},
 | 
			
		||||
@ -55,7 +55,7 @@ var (
 | 
			
		||||
			"src":  "\x00REQ\x00\x00\x00\x19\x00\x00\x00\x03a\x00b",
 | 
			
		||||
			"data": "a\x00b",
 | 
			
		||||
		},
 | 
			
		||||
		SET_CLIENT_ID: map[string]string{
 | 
			
		||||
		dtSetClientId: map[string]string{
 | 
			
		||||
			"src":  "\x00REQ\x00\x00\x00\x16\x00\x00\x00\x01a",
 | 
			
		||||
			"data": "a",
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ const (
 | 
			
		||||
type Worker struct {
 | 
			
		||||
	sync.Mutex
 | 
			
		||||
	agents  []*agent
 | 
			
		||||
	funcs   JobFuncs
 | 
			
		||||
	funcs   jobFuncs
 | 
			
		||||
	in      chan *inPack
 | 
			
		||||
	running bool
 | 
			
		||||
 | 
			
		||||
@ -41,8 +41,8 @@ type Worker struct {
 | 
			
		||||
func New(limit int) (worker *Worker) {
 | 
			
		||||
	worker = &Worker{
 | 
			
		||||
		agents: make([]*agent, 0, limit),
 | 
			
		||||
		funcs:  make(JobFuncs),
 | 
			
		||||
		in:     make(chan *inPack, QUEUE_SIZE),
 | 
			
		||||
		funcs:  make(jobFuncs),
 | 
			
		||||
		in:     make(chan *inPack, queueSize),
 | 
			
		||||
	}
 | 
			
		||||
	if limit != Unlimited {
 | 
			
		||||
		worker.limit = make(chan bool, limit-1)
 | 
			
		||||
@ -97,10 +97,10 @@ func (worker *Worker) AddFunc(funcname string,
 | 
			
		||||
func (worker *Worker) addFunc(funcname string, timeout uint32) {
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	if timeout == 0 {
 | 
			
		||||
		outpack.dataType = CAN_DO
 | 
			
		||||
		outpack.dataType = dtCanDo
 | 
			
		||||
		outpack.data = []byte(funcname)
 | 
			
		||||
	} else {
 | 
			
		||||
		outpack.dataType = CAN_DO_TIMEOUT
 | 
			
		||||
		outpack.dataType = dtCanDoTimeout
 | 
			
		||||
		l := len(funcname)
 | 
			
		||||
		outpack.data = getBuffer(l + 5)
 | 
			
		||||
		copy(outpack.data, []byte(funcname))
 | 
			
		||||
@ -127,7 +127,7 @@ func (worker *Worker) RemoveFunc(funcname string) (err error) {
 | 
			
		||||
// inner remove
 | 
			
		||||
func (worker *Worker) removeFunc(funcname string) {
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	outpack.dataType = CANT_DO
 | 
			
		||||
	outpack.dataType = dtCantDo
 | 
			
		||||
	outpack.data = []byte(funcname)
 | 
			
		||||
	worker.broadcast(outpack)
 | 
			
		||||
}
 | 
			
		||||
@ -135,11 +135,11 @@ func (worker *Worker) removeFunc(funcname string) {
 | 
			
		||||
// inner package handling
 | 
			
		||||
func (worker *Worker) handleInPack(inpack *inPack) {
 | 
			
		||||
	switch inpack.dataType {
 | 
			
		||||
	case NO_JOB:
 | 
			
		||||
	case dtNoJob:
 | 
			
		||||
		inpack.a.PreSleep()
 | 
			
		||||
	case NOOP:
 | 
			
		||||
	case dtNoop:
 | 
			
		||||
		inpack.a.Grab()
 | 
			
		||||
	case JOB_ASSIGN, JOB_ASSIGN_UNIQ:
 | 
			
		||||
	case dtJobAssign, dtJobAssignUniq:
 | 
			
		||||
		go func() {
 | 
			
		||||
			if err := worker.exec(inpack); err != nil {
 | 
			
		||||
				worker.err(err)
 | 
			
		||||
@ -149,10 +149,10 @@ func (worker *Worker) handleInPack(inpack *inPack) {
 | 
			
		||||
			worker.limit <- true
 | 
			
		||||
		}
 | 
			
		||||
		inpack.a.Grab()
 | 
			
		||||
	case ERROR:
 | 
			
		||||
	case dtError:
 | 
			
		||||
		worker.err(inpack.Err())
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case ECHO_RES:
 | 
			
		||||
	case dtEchoRes:
 | 
			
		||||
		fallthrough
 | 
			
		||||
	default:
 | 
			
		||||
		worker.customeHandler(inpack)
 | 
			
		||||
@ -219,7 +219,7 @@ func (worker *Worker) Close() {
 | 
			
		||||
// Echo
 | 
			
		||||
func (worker *Worker) Echo(data []byte) {
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	outpack.dataType = ECHO_REQ
 | 
			
		||||
	outpack.dataType = dtEchoReq
 | 
			
		||||
	outpack.data = data
 | 
			
		||||
	worker.broadcast(outpack)
 | 
			
		||||
}
 | 
			
		||||
@ -228,16 +228,16 @@ func (worker *Worker) Echo(data []byte) {
 | 
			
		||||
// Both from the worker and job servers.
 | 
			
		||||
func (worker *Worker) Reset() {
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	outpack.dataType = RESET_ABILITIES
 | 
			
		||||
	outpack.dataType = dtResetAbilities
 | 
			
		||||
	worker.broadcast(outpack)
 | 
			
		||||
	worker.funcs = make(JobFuncs)
 | 
			
		||||
	worker.funcs = make(jobFuncs)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Set the worker's unique id.
 | 
			
		||||
func (worker *Worker) SetId(id string) {
 | 
			
		||||
	worker.Id = id
 | 
			
		||||
	outpack := getOutPack()
 | 
			
		||||
	outpack.dataType = SET_CLIENT_ID
 | 
			
		||||
	outpack.dataType = dtSetClientId
 | 
			
		||||
	outpack.data = []byte(id)
 | 
			
		||||
	worker.broadcast(outpack)
 | 
			
		||||
}
 | 
			
		||||
@ -270,12 +270,12 @@ func (worker *Worker) exec(inpack *inPack) (err error) {
 | 
			
		||||
	if worker.running {
 | 
			
		||||
		outpack := getOutPack()
 | 
			
		||||
		if r.err == nil {
 | 
			
		||||
			outpack.dataType = WORK_COMPLETE
 | 
			
		||||
			outpack.dataType = dtWorkComplete
 | 
			
		||||
		} else {
 | 
			
		||||
			if len(r.data) == 0 {
 | 
			
		||||
				outpack.dataType = WORK_FAIL
 | 
			
		||||
				outpack.dataType = dtWorkFail
 | 
			
		||||
			} else {
 | 
			
		||||
				outpack.dataType = WORK_EXCEPTION
 | 
			
		||||
				outpack.dataType = dtWorkException
 | 
			
		||||
			}
 | 
			
		||||
			err = r.err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user