/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ package org.roda.core.plugins.orchestrate.akka.distributed; import static akka.pattern.Patterns.ask; import static akka.pattern.Patterns.pipe; import java.io.Serializable; import java.util.concurrent.TimeUnit; import akka.actor.ActorRef; import akka.actor.UntypedActor; import akka.cluster.singleton.ClusterSingletonProxy; import akka.cluster.singleton.ClusterSingletonProxySettings; import akka.dispatch.Mapper; import akka.dispatch.Recover; import akka.util.Timeout; import scala.concurrent.ExecutionContext; import scala.concurrent.Future; public class Frontend extends UntypedActor { private ActorRef masterProxy = getContext().actorOf(ClusterSingletonProxy.props("/user/master", ClusterSingletonProxySettings.create(getContext().system()).withRole("backend")), "masterProxy"); @Override public void onReceive(Object message) { Timeout timeout = new Timeout(5, TimeUnit.SECONDS); Future<Object> f = ask(masterProxy, message, timeout); 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 static final long serialVersionUID = -3294129455437847409L; 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 static final long serialVersionUID = 3982864218335249125L; private NotOk() { } private static final NotOk instance = new NotOk(); public static NotOk getInstance() { return instance; } @Override public String toString() { return "NotOk"; } } }