=sam #3843 Use ClusterSingletonProxy in cluster samples
This commit is contained in:
parent
f457e0a30c
commit
ad18405877
11 changed files with 41 additions and 173 deletions
|
|
@ -1,95 +0,0 @@
|
|||
package sample.cluster.stats;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import sample.cluster.stats.StatsMessages.JobFailed;
|
||||
import sample.cluster.stats.StatsMessages.StatsJob;
|
||||
import akka.actor.ActorSelection;
|
||||
import akka.actor.UntypedActor;
|
||||
import akka.cluster.Cluster;
|
||||
import akka.cluster.ClusterEvent.CurrentClusterState;
|
||||
import akka.cluster.ClusterEvent.MemberEvent;
|
||||
import akka.cluster.ClusterEvent.MemberUp;
|
||||
import akka.cluster.ClusterEvent.MemberRemoved;
|
||||
import akka.cluster.Member;
|
||||
import akka.event.Logging;
|
||||
import akka.event.LoggingAdapter;
|
||||
|
||||
//#facade
|
||||
public class StatsFacade extends UntypedActor {
|
||||
|
||||
final LoggingAdapter log = Logging.getLogger(getContext().system(), this);
|
||||
final Cluster cluster = Cluster.get(getContext().system());
|
||||
|
||||
final Comparator<Member> ageComparator = new Comparator<Member>() {
|
||||
public int compare(Member a, Member b) {
|
||||
if (a.isOlderThan(b))
|
||||
return -1;
|
||||
else if (b.isOlderThan(a))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
final SortedSet<Member> membersByAge = new TreeSet<Member>(ageComparator);
|
||||
|
||||
//subscribe to cluster changes
|
||||
@Override
|
||||
public void preStart() {
|
||||
cluster.subscribe(getSelf(), MemberEvent.class);
|
||||
}
|
||||
|
||||
//re-subscribe when restart
|
||||
@Override
|
||||
public void postStop() {
|
||||
cluster.unsubscribe(getSelf());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Object message) {
|
||||
if (message instanceof StatsJob && membersByAge.isEmpty()) {
|
||||
getSender().tell(new JobFailed("Service unavailable, try again later"),
|
||||
getSelf());
|
||||
|
||||
} else if (message instanceof StatsJob) {
|
||||
currentMaster().tell(message, getSender());
|
||||
|
||||
} else if (message instanceof CurrentClusterState) {
|
||||
CurrentClusterState state = (CurrentClusterState) message;
|
||||
List<Member> members = new ArrayList<Member>();
|
||||
for (Member m : state.getMembers()) {
|
||||
if (m.hasRole("compute"))
|
||||
members.add(m);
|
||||
}
|
||||
membersByAge.clear();
|
||||
membersByAge.addAll(members);
|
||||
|
||||
} else if (message instanceof MemberUp) {
|
||||
Member m = ((MemberUp) message).member();
|
||||
if (m.hasRole("compute"))
|
||||
membersByAge.add(m);
|
||||
|
||||
} else if (message instanceof MemberRemoved) {
|
||||
Member m = ((MemberRemoved) message).member();
|
||||
if (m.hasRole("compute"))
|
||||
membersByAge.remove(m);
|
||||
|
||||
} else if (message instanceof MemberEvent) {
|
||||
// not interesting
|
||||
|
||||
} else {
|
||||
unhandled(message);
|
||||
}
|
||||
}
|
||||
|
||||
ActorSelection currentMaster() {
|
||||
return getContext().actorSelection(
|
||||
membersByAge.first().address() + "/user/singleton/statsService");
|
||||
}
|
||||
|
||||
}
|
||||
//#facade
|
||||
|
|
@ -11,7 +11,7 @@ public class StatsSampleOneMasterClientMain {
|
|||
// note that client is not a compute node, role not defined
|
||||
ActorSystem system = ActorSystem.create("ClusterSystem",
|
||||
ConfigFactory.load("stats2"));
|
||||
system.actorOf(Props.create(StatsSampleClient.class, "/user/statsFacade"),
|
||||
system.actorOf(Props.create(StatsSampleClient.class, "/user/statsServiceProxy"),
|
||||
"client");
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import akka.actor.ActorSystem;
|
|||
import akka.actor.PoisonPill;
|
||||
import akka.actor.Props;
|
||||
import akka.contrib.pattern.ClusterSingletonManager;
|
||||
import akka.contrib.pattern.ClusterSingletonProxy;
|
||||
|
||||
public class StatsSampleOneMasterMain {
|
||||
|
||||
|
|
@ -36,7 +37,10 @@ public class StatsSampleOneMasterMain {
|
|||
PoisonPill.getInstance(), "compute"), "singleton");
|
||||
//#create-singleton-manager
|
||||
|
||||
system.actorOf(Props.create(StatsFacade.class), "statsFacade");
|
||||
//#singleton-proxy
|
||||
system.actorOf(ClusterSingletonProxy.defaultProps("/user/singleton/statsService",
|
||||
"compute"), "statsServiceProxy");
|
||||
//#singleton-proxy
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue