github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/23_proto_actor/cluster/member/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 console "github.com/AsynkronIT/goconsole" 9 "github.com/AsynkronIT/protoactor-go/actor" 10 "github.com/AsynkronIT/protoactor-go/cluster" 11 "github.com/AsynkronIT/protoactor-go/cluster/consul" 12 "github.com/AsynkronIT/protoactor-go/examples/cluster/shared" 13 "github.com/AsynkronIT/protoactor-go/remote" 14 ) 15 16 func main() { 17 // this node knows about Hello kind 18 remote.Register("Hello", actor.PropsFromProducer(func() actor.Actor { 19 return &shared.HelloActor{} 20 })) 21 22 cp, err := consul.New() 23 if err != nil { 24 log.Fatal(err) 25 } 26 cluster.Start("mycluster", "127.0.0.1:8081", cp) 27 28 sync() 29 async() 30 31 console.ReadLine() 32 33 cluster.Shutdown(true) 34 } 35 36 func sync() { 37 hello := shared.GetHelloGrain("abc") 38 options := cluster.NewGrainCallOptions().WithTimeout(5 * time.Second).WithRetry(5) 39 40 res, err := hello.SayHelloWithOpts(&shared.HelloRequest{Name: "GAM"}, options) 41 if err != nil { 42 log.Fatal(err) 43 } 44 log.Printf("Message from SayHello: %v", res.Message) 45 for i := 0; i < 10000; i++ { 46 x := shared.GetHelloGrain(fmt.Sprintf("hello%v", i)) 47 x.SayHello(&shared.HelloRequest{Name: "GAM"}) 48 } 49 log.Println("Done") 50 } 51 52 func async() { 53 hello := shared.GetHelloGrain("abc") 54 c, e := hello.AddChan(&shared.AddRequest{A: 123, B: 456}) 55 56 for { 57 select { 58 case <-time.After(100 * time.Millisecond): 59 log.Println("Tick..") // this might not happen if res returns fast enough 60 case err := <-e: 61 log.Fatal(err) 62 case res := <-c: 63 log.Printf("Result is %v", res.Result) 64 return 65 } 66 } 67 }