github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/23_proto_actor/cluster-broadcast/shared/trackerGrain.go (about) 1 package shared 2 3 import ( 4 "fmt" 5 "github.com/AsynkronIT/protoactor-go/cluster" 6 ) 7 8 type TrackGrain struct { 9 cluster.Grain 10 grainsMap map[string]bool 11 } 12 13 func (t *TrackGrain) Init(id string) { 14 t.Grain.Init(id) 15 t.grainsMap = map[string]bool{} 16 } 17 18 func (t *TrackGrain) Terminate() { 19 } 20 21 func (t *TrackGrain) RegisterGrain(n *RegisterMessage, ctx cluster.GrainContext) (*Noop, error) { 22 t.grainsMap[n.GrainId] = true 23 return &Noop{}, nil 24 } 25 26 func (t *TrackGrain) DeregisterGrain(n *RegisterMessage, ctx cluster.GrainContext) (*Noop, error) { 27 delete(t.grainsMap, n.GrainId) 28 return &Noop{}, nil 29 } 30 31 func (t *TrackGrain) BroadcastGetCounts(n *Noop, ctx cluster.GrainContext) (*TotalsResponse, error) { 32 33 totals := map[string]int64{} 34 for grainAddress, _ := range t.grainsMap { 35 calcGrain := GetCalculatorGrain(grainAddress) 36 grainTotal, err := calcGrain.GetCurrent(&Noop{}) 37 if err != nil { 38 fmt.Sprintf("Grain %s issued an error : %s", grainAddress, err) 39 } 40 fmt.Sprintf("Grain %s - %v", grainAddress, grainTotal.Number) 41 totals[grainAddress] = grainTotal.Number 42 } 43 44 return &TotalsResponse{Totals: totals}, nil 45 }