public ClusterMetricsCollector(ActorRef publisher)
{
_publisher = publisher;
_cluster = Cluster.Get(Context.System);
Collector = MetricsCollector.Get(Context.System.AsInstanceOf <ExtendedActorSystem>(), _cluster.Settings);
LatestGossip = MetricsGossip.Empty;
Nodes = ImmutableHashSet.Create <Address>();
_metricsTask = new CancellationTokenSource();
Context.System.Scheduler.Schedule(_cluster.Settings.PeriodicTasksInitialDelay.Max(_cluster.Settings.MetricsInterval),
_cluster.Settings.MetricsInterval, Self, InternalClusterAction.MetricsTick.Instance, _metricsTask.Token);
_gossipTask = new CancellationTokenSource();
Context.System.Scheduler.Schedule(_cluster.Settings.PeriodicTasksInitialDelay.Max(_cluster.Settings.GossipInterval),
_cluster.Settings.GossipInterval, Self, InternalClusterAction.GossipTick.Instance, _gossipTask.Token);
Receive <InternalClusterAction.GossipTick>(tick => Gossip());
Receive <InternalClusterAction.MetricsTick>(tick => Collect());
Receive <MetricsGossipEnvelope>(envelope => ReceiveGossip(envelope));
Receive <ClusterEvent.CurrentClusterState>(state => ReceiveState(state));
Receive <ClusterEvent.MemberUp>(up => AddMember(up.Member));
Receive <ClusterEvent.MemberRemoved>(removed => RemoveMember(removed.Member));
Receive <ClusterEvent.MemberExited>(exited => RemoveMember(exited.Member));
Receive <ClusterEvent.UnreachableMember>(member => RemoveMember(member.Member));
Receive <ClusterEvent.ReachableMember>(member =>
{
if (member.Member.Status == MemberStatus.Up)
{
AddMember(member.Member);
}
});
Receive <ClusterEvent.IMemberEvent>(@event => { }); //not interested in other types of member event
}