forked from yuxh/gearman-go
		
	add support for own ids
This commit is contained in:
		
							parent
							
								
									d36dcb7fc2
								
							
						
					
					
						commit
						fa71d7a37a
					
				@ -217,7 +217,10 @@ type handleOrError struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (client *Client) do(funcname string, data []byte,
 | 
					func (client *Client) do(funcname string, data []byte,
 | 
				
			||||||
	flag uint32, h ResponseHandler) (handle string, err error) {
 | 
						flag uint32, h ResponseHandler, id string) (handle string, err error) {
 | 
				
			||||||
 | 
						if len(id) == 0 {
 | 
				
			||||||
 | 
							return "", ErrInvalidId
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if client.conn == nil {
 | 
						if client.conn == nil {
 | 
				
			||||||
		return "", ErrLostConn
 | 
							return "", ErrLostConn
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -233,7 +236,6 @@ func (client *Client) do(funcname string, data []byte,
 | 
				
			|||||||
		handle = resp.Handle
 | 
							handle = resp.Handle
 | 
				
			||||||
		result <- handleOrError{handle, nil}
 | 
							result <- handleOrError{handle, nil}
 | 
				
			||||||
	}, h)
 | 
						}, h)
 | 
				
			||||||
	id := IdGen.Id()
 | 
					 | 
				
			||||||
	req := getJob(id, []byte(funcname), data)
 | 
						req := getJob(id, []byte(funcname), data)
 | 
				
			||||||
	req.DataType = flag
 | 
						req.DataType = flag
 | 
				
			||||||
	if err = client.write(req); err != nil {
 | 
						if err = client.write(req); err != nil {
 | 
				
			||||||
@ -255,17 +257,7 @@ func (client *Client) do(funcname string, data []byte,
 | 
				
			|||||||
// flag can be set to: JobLow, JobNormal and JobHigh
 | 
					// flag can be set to: JobLow, JobNormal and JobHigh
 | 
				
			||||||
func (client *Client) Do(funcname string, data []byte,
 | 
					func (client *Client) Do(funcname string, data []byte,
 | 
				
			||||||
	flag byte, h ResponseHandler) (handle string, err error) {
 | 
						flag byte, h ResponseHandler) (handle string, err error) {
 | 
				
			||||||
	var datatype uint32
 | 
						handle, err = client.DoWithId(funcname, data, flag, h, IdGen.Id())
 | 
				
			||||||
	switch flag {
 | 
					 | 
				
			||||||
	case JobLow:
 | 
					 | 
				
			||||||
		datatype = dtSubmitJobLow
 | 
					 | 
				
			||||||
	case JobHigh:
 | 
					 | 
				
			||||||
		datatype = dtSubmitJobHigh
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		datatype = dtSubmitJob
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	handle, err = client.do(funcname, data, datatype, h)
 | 
					 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -273,19 +265,7 @@ func (client *Client) Do(funcname string, data []byte,
 | 
				
			|||||||
// flag can be set to: JobLow, JobNormal and JobHigh
 | 
					// flag can be set to: JobLow, JobNormal and JobHigh
 | 
				
			||||||
func (client *Client) DoBg(funcname string, data []byte,
 | 
					func (client *Client) DoBg(funcname string, data []byte,
 | 
				
			||||||
	flag byte) (handle string, err error) {
 | 
						flag byte) (handle string, err error) {
 | 
				
			||||||
	if client.conn == nil {
 | 
						handle, err = client.DoBgWithId(funcname, data, flag, IdGen.Id())
 | 
				
			||||||
		return "", ErrLostConn
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var datatype uint32
 | 
					 | 
				
			||||||
	switch flag {
 | 
					 | 
				
			||||||
	case JobLow:
 | 
					 | 
				
			||||||
		datatype = dtSubmitJobLowBg
 | 
					 | 
				
			||||||
	case JobHigh:
 | 
					 | 
				
			||||||
		datatype = dtSubmitJobHighBg
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		datatype = dtSubmitJobBg
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	handle, err = client.do(funcname, data, datatype, nil)
 | 
					 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -341,3 +321,40 @@ func (client *Client) Close() (err error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Call the function and get a response.
 | 
				
			||||||
 | 
					// flag can be set to: JobLow, JobNormal and JobHigh
 | 
				
			||||||
 | 
					func (client *Client) DoWithId(funcname string, data []byte,
 | 
				
			||||||
 | 
						flag byte, h ResponseHandler, id string) (handle string, err error) {
 | 
				
			||||||
 | 
						var datatype uint32
 | 
				
			||||||
 | 
						switch flag {
 | 
				
			||||||
 | 
						case JobLow:
 | 
				
			||||||
 | 
							datatype = dtSubmitJobLow
 | 
				
			||||||
 | 
						case JobHigh:
 | 
				
			||||||
 | 
							datatype = dtSubmitJobHigh
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							datatype = dtSubmitJob
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handle, err = client.do(funcname, data, datatype, h, id)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Call the function in background, no response needed.
 | 
				
			||||||
 | 
					// flag can be set to: JobLow, JobNormal and JobHigh
 | 
				
			||||||
 | 
					func (client *Client) DoBgWithId(funcname string, data []byte,
 | 
				
			||||||
 | 
						flag byte, id string) (handle string, err error) {
 | 
				
			||||||
 | 
						if client.conn == nil {
 | 
				
			||||||
 | 
							return "", ErrLostConn
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var datatype uint32
 | 
				
			||||||
 | 
						switch flag {
 | 
				
			||||||
 | 
						case JobLow:
 | 
				
			||||||
 | 
							datatype = dtSubmitJobLowBg
 | 
				
			||||||
 | 
						case JobHigh:
 | 
				
			||||||
 | 
							datatype = dtSubmitJobHighBg
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							datatype = dtSubmitJobBg
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						handle, err = client.do(funcname, data, datatype, nil, id)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,11 @@
 | 
				
			|||||||
package client
 | 
					package client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"crypto/md5"
 | 
				
			||||||
 | 
						"encoding/hex"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"flag"
 | 
						"flag"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
@ -72,6 +75,42 @@ func TestClientDoBg(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestClientDoBgWithId(t *testing.T) {
 | 
				
			||||||
 | 
						if !runIntegrationTests {
 | 
				
			||||||
 | 
							t.Skip("To run this test, use: go test -integration")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						data := []byte("abcdef")
 | 
				
			||||||
 | 
						hash := md5.Sum(data)
 | 
				
			||||||
 | 
						id := hex.EncodeToString(hash[:])
 | 
				
			||||||
 | 
						handle, err := client.DoBgWithId("ToUpper", data, JobLow, id)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if handle == "" {
 | 
				
			||||||
 | 
							t.Error("Handle is empty.")
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							t.Log(handle)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestClientDoBgWithIdFailsIfNoId(t *testing.T) {
 | 
				
			||||||
 | 
						if !runIntegrationTests {
 | 
				
			||||||
 | 
							t.Skip("To run this test, use: go test -integration")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						data := []byte("abcdef")
 | 
				
			||||||
 | 
						id := ""
 | 
				
			||||||
 | 
						_, err := client.DoBgWithId("ToUpper", data, JobLow, id)
 | 
				
			||||||
 | 
						if err == nil {
 | 
				
			||||||
 | 
							t.Error("Expecting error")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err.Error() != "Invalid ID" {
 | 
				
			||||||
 | 
							t.Error(fmt.Sprintf("Expecting \"Invalid ID\" error, got %s.", err.Error()))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestClientDo(t *testing.T) {
 | 
					func TestClientDo(t *testing.T) {
 | 
				
			||||||
	if !runIntegrationTests {
 | 
						if !runIntegrationTests {
 | 
				
			||||||
		t.Skip("To run this test, use: go test -integration")
 | 
							t.Skip("To run this test, use: go test -integration")
 | 
				
			||||||
@ -98,6 +137,138 @@ func TestClientDo(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestClientDoWithId(t *testing.T) {
 | 
				
			||||||
 | 
						if !runIntegrationTests {
 | 
				
			||||||
 | 
							t.Skip("To run this test, use: go test -integration")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						jobHandler := func(job *Response) {
 | 
				
			||||||
 | 
							str := string(job.Data)
 | 
				
			||||||
 | 
							if str == "ABCDEF" {
 | 
				
			||||||
 | 
								t.Log(str)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								t.Errorf("Invalid data: %s", job.Data)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						data := []byte("abcdef")
 | 
				
			||||||
 | 
						hash := md5.Sum(data)
 | 
				
			||||||
 | 
						id := hex.EncodeToString(hash[:])
 | 
				
			||||||
 | 
						handle, err := client.DoWithId("ToUpper", data,
 | 
				
			||||||
 | 
							JobLow, jobHandler, id)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if handle == "" {
 | 
				
			||||||
 | 
							t.Error("Handle is empty.")
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							t.Log(handle)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestClientDoWithIdFailsIfNoId(t *testing.T) {
 | 
				
			||||||
 | 
						if !runIntegrationTests {
 | 
				
			||||||
 | 
							t.Skip("To run this test, use: go test -integration")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						jobHandler := func(job *Response) {
 | 
				
			||||||
 | 
							str := string(job.Data)
 | 
				
			||||||
 | 
							if str == "ABCDEF" {
 | 
				
			||||||
 | 
								t.Log(str)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								t.Errorf("Invalid data: %s", job.Data)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						data := []byte("abcdef")
 | 
				
			||||||
 | 
						id := ""
 | 
				
			||||||
 | 
						_, err := client.DoWithId("ToUpper", data,
 | 
				
			||||||
 | 
							JobLow, jobHandler, id)
 | 
				
			||||||
 | 
						if err == nil {
 | 
				
			||||||
 | 
							t.Error("Expecting error")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err.Error() != "Invalid ID" {
 | 
				
			||||||
 | 
							t.Error(fmt.Sprintf("Expecting \"Invalid ID\" error, got %s.", err.Error()))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestClientDoWithIdCheckSameHandle(t *testing.T) {
 | 
				
			||||||
 | 
						if !runIntegrationTests {
 | 
				
			||||||
 | 
							t.Skip("To run this test, use: go test -integration")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						jobHandler := func(job *Response) {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						data := []byte("{productId:123,categoryId:1}")
 | 
				
			||||||
 | 
						id := "123"
 | 
				
			||||||
 | 
						handle1, err := client.DoWithId("PublishProduct", data,
 | 
				
			||||||
 | 
							JobLow, jobHandler, id)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if handle1 == "" {
 | 
				
			||||||
 | 
							t.Error("Handle is empty.")
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							t.Log(handle1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						handle2, err := client.DoWithId("PublishProduct", data,
 | 
				
			||||||
 | 
							JobLow, jobHandler, id)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if handle2 == "" {
 | 
				
			||||||
 | 
							t.Error("Handle is empty.")
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							t.Log(handle2)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if handle1 != handle2 {
 | 
				
			||||||
 | 
							t.Error("expecting the same handle when using the same id on the same Job name")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestClientDoWithIdCheckDifferentHandleOnDifferentJobs(t *testing.T) {
 | 
				
			||||||
 | 
						if !runIntegrationTests {
 | 
				
			||||||
 | 
							t.Skip("To run this test, use: go test -integration")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						jobHandler := func(job *Response) {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						data := []byte("{productId:123}")
 | 
				
			||||||
 | 
						id := "123"
 | 
				
			||||||
 | 
						handle1, err := client.DoWithId("PublishProduct", data,
 | 
				
			||||||
 | 
							JobLow, jobHandler, id)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if handle1 == "" {
 | 
				
			||||||
 | 
							t.Error("Handle is empty.")
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							t.Log(handle1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						handle2, err := client.DoWithId("DeleteProduct", data,
 | 
				
			||||||
 | 
							JobLow, jobHandler, id)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if handle2 == "" {
 | 
				
			||||||
 | 
							t.Error("Handle is empty.")
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							t.Log(handle2)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if handle1 == handle2 {
 | 
				
			||||||
 | 
							t.Error("expecting different handles because there are different job names")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestClientMultiDo(t *testing.T) {
 | 
					func TestClientMultiDo(t *testing.T) {
 | 
				
			||||||
	if !runIntegrationTests {
 | 
						if !runIntegrationTests {
 | 
				
			||||||
		t.Skip("To run this test, use: go test -integration")
 | 
							t.Skip("To run this test, use: go test -integration")
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@ import (
 | 
				
			|||||||
var (
 | 
					var (
 | 
				
			||||||
	ErrWorkWarning   = errors.New("Work warning")
 | 
						ErrWorkWarning   = errors.New("Work warning")
 | 
				
			||||||
	ErrInvalidData   = errors.New("Invalid data")
 | 
						ErrInvalidData   = errors.New("Invalid data")
 | 
				
			||||||
 | 
						ErrInvalidId     = errors.New("Invalid ID")
 | 
				
			||||||
	ErrWorkFail      = errors.New("Work fail")
 | 
						ErrWorkFail      = errors.New("Work fail")
 | 
				
			||||||
	ErrWorkException = errors.New("Work exeption")
 | 
						ErrWorkException = errors.New("Work exeption")
 | 
				
			||||||
	ErrDataType      = errors.New("Invalid data type")
 | 
						ErrDataType      = errors.New("Invalid data type")
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user