package models.com.mc.workers; import akka.actor.ActorRef; import akka.actor.UntypedActor; import akka.contrib.pattern.DistributedPubSubExtension; import akka.contrib.pattern.DistributedPubSubMediator.Send; import akka.dispatch.Mapper; import akka.dispatch.Recover; import akka.util.Timeout; import scala.concurrent.ExecutionContext; import scala.concurrent.Future; import scala.concurrent.duration.Duration; import java.io.Serializable; import static akka.pattern.Patterns.pipe; import static akka.pattern.Patterns.ask; public class Frontend extends UntypedActor { final ActorRef mediator = DistributedPubSubExtension.get(getContext().system()).mediator(); public void onReceive(Object message) { Future<Object> f = ask(mediator, new Send("/user/master/active", message, false), new Timeout(Duration.create(5, "seconds"))); final ExecutionContext ec = getContext().system().dispatcher(); Future<Object> res = f.map(new Mapper<Object, Object>() { @Override public Object apply(Object msg) { if (msg instanceof Master.Ack) return Ok.getInstance(); else return super.apply(msg); } }, ec).recover(new Recover<Object>() { @Override public Object recover(Throwable failure) throws Throwable { return NotOk.getInstance(); } }, ec); pipe(res, ec).to(getSender()); } public static final class Ok implements Serializable { private Ok() {} private static final Ok instance = new Ok(); public static Ok getInstance() { return instance; } @Override public String toString() { return "Ok"; } }; public static final class NotOk implements Serializable { private NotOk() {} private static final NotOk instance = new NotOk(); public static NotOk getInstance() { return instance; } @Override public String toString() { return "NotOk"; } }; }