2019年4月14日日曜日

go-workers で Struct をエンキューしたらどうなるか

概要

タイトルの通りです
go-workers でエンキュー/デキューするときに struct の情報がどうなるか試してみました

環境

  • macOS 10.14.4
  • go 1.11.5

struct を管理するパッケージ

エンキューする側、ワーカー側から参照するので外出ししておきます

  • vim utils/utils.go
package utils

type MyStruct struct {
    Name string
    Age  int
}

エンキュー

まずはエンキューします
エンキューする際に struct をそのまま投げてみます

  • vim main.go
package main

import (
    "github.com/jrallison/go-workers"
    "github.com/hawksnowlog/a/utils"
)

func main() {
    workers.Configure(map[string]string{
        "server":  "localhost:6379",
        "process": "1",
    })
    st := utils.MyStruct{
        Name: "hawksnowlog",
        Age:  20,
    }
    workers.Enqueue("default", "SampleWorker", st)
}
  • go run main.go

これでエンキューできます
事前に redis-server は上げておきましょう

Redis 確認

Redis に入った情報を確認してみたところ json に変換されて入っているようです
今度はこれをデキューして struct に変換してみます 

127.0.0.1:6379> LRANGE queue:default 0 -1
1) "{\"queue\":\"default\",\"class\":\"SampleWorker\",\"args\":{\"Name\":\"hawksnowlog\",\"Age\":20},\"jid\":\"180127fab357439ddd229174\",\"enqueued_at\":1554960010.4390862,\"at\":1554960010.4390862}"

worker 側でデキューする

最終的に struct に落とし込みますが直接はできませんでした
一旦 json 文字列を取得してそれを json.Unmarshal() する感じ です

  • vim worker/worker.go
package main

import (
    "encoding/json"
    "fmt"
    "github.com/jrallison/go-workers"
    "github.com/hawksnowlog/a/utils"
)

func perform(msg *workers.Msg) {
    j := msg.Args().ToJson()
    st := utils.MyStruct{}
    err := json.Unmarshal([]byte(j), &st)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(st.Name)
    fmt.Println(st.Age)
}

func main() {
    workers.Configure(map[string]string{
        "server":  "localhost:6379",
        "process": "1",
    })
    workers.Process("default", perform, 1)
    workers.Run()
}
  • go run worker/worker.go

最後に

go-workers でエンキュー/デキューするのに struct を使ってみました
エンキューする際はそのまま struct を投げられます
デキューするときだけ json 文字列から struct に変換する必要がありました
デキューするときだけ少し面倒な感じはしますが簡単にできます

調査不足かもしれないで何ともですがもしかしたら直接指定した struct に変換してくれる機能が go-workers にあるかもしれません

0 件のコメント:

コメントを投稿