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  }