2015-06-07 3 views
0

Я использую очередь задач go и google, чтобы создать некоторые задания синхронизации.Отказ от ответа ядра из очереди задач

Я успешно передаю данные методу работника, но я не могу его размонтировать, чтобы использовать его.

Я пробовал разные способы, я получаю сообщение об ошибке распаковать

err um &json.SyntaxError{msg:"invalid character 'i' in literal false (expecting 'a')", Offset:2} 

Это, как я буду передавать данные в очередь

keys := make(map[string][]string) 
    keys["filenames"] = req.FileNames // []string 

    t := taskqueue.NewPOSTTask("/deletetask", keys) 
    _, err = taskqueue.Add(ctx, t, "delete") 

И это, как я пытался распаковать его

type Files struct { 
fileNames string `json:"filenames"` 
} 


func worker(w http.ResponseWriter, r *http.Request) { 
c := appengine.NewContext(r) 

var objmap map[string]json.RawMessage 
b, err := ioutil.ReadAll(r.Body) 
if err != nil { 
    c.Debugf("err io %#v", err) 
} 
c.Debugf("b %#v", string(b[:])) //Print: b "filenames=1.txt&filenames=2.txt" 

err = json.Unmarshal(b, &objmap) 
if err != nil { 
    c.Debugf("err um %#v", err) 
} 
//this didn't work as well same err 
    f := []Files{} 
    err = json.Unmarshal(b, &f) 
} 
+1

Переданных к задаче параметров не json, поэтому unmarshalling как таковой не будет работать. Ваш код может быть почти идентичен приведенному здесь примеру: https://cloud.google.com/appengine/docs/go/taskqueue/overview-push – Greg

ответ

0

Аргументы для задач отправляются как значения POST, вы назначаете срез строк как POST-значение fo r ключ filenames.

Затем вы пытаетесь десериализовать полный орган запроса POST как JSON.

простое решение было бы разделить каждый файл в одной задаче и просто отправить имя файла в качестве значения строки, то это будет что-то вроде:

// Add tasks 
for i := range req.FileNames { 
    postValues := url.Values{} 
    postValues.Set("fileName", req.FileNames[i]) 

    t := taskqueue.NewPOSTTask("/deletetask", postValues) 
    if _, err := taskqueue.Add(ctx, t, "delete"); err != nil { 
     c.Errorf("Failed add task, error: %v, fileName: %v", err, req.FileNames[i]) 
    } 
} 

// The actual delete worker 
func worker(w http.ResponseWriter, r *http.Request) { 
    ctx := appengine.NewContext(r) 
    fileName := r.FormValue("fileName") 

    ctx.Infof("Deleting: %v", fileName) 
} 
Смежные вопросы