概要
タイトルの通りです
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 件のコメント:
コメントを投稿