package oncue.client; import static akka.pattern.Patterns.ask; import java.util.Collection; import java.util.HashMap; import java.util.Map; import oncue.common.messages.EnqueueJob; import oncue.common.messages.Job; import oncue.common.messages.JobSummary; import oncue.common.messages.SimpleMessages.SimpleMessage; import oncue.common.settings.Settings; import oncue.common.settings.SettingsProvider; import scala.concurrent.Await; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.event.Logging; import akka.event.LoggingAdapter; import akka.pattern.AskTimeoutException; import akka.util.Timeout; public class AkkaClient implements Client { private LoggingAdapter log; private Settings settings; private ActorRef scheduler; public AkkaClient(ActorSystem system, ActorRef scheduler) { this.scheduler = scheduler; log = Logging.getLogger(system, this); settings = SettingsProvider.SettingsProvider.get(system); } @Override public Job enqueueJob(String workerType) throws ClientException { return enqueueJob(workerType, new HashMap<String, String>()); } @Override public Job enqueueJob(String workerType, Map<String, String> jobParams) throws ClientException { try { return (Job) Await.result( ask(scheduler, new EnqueueJob(workerType, jobParams), new Timeout(settings.SCHEDULER_TIMEOUT)), settings.SCHEDULER_TIMEOUT); } catch (Exception e) { if (e instanceof AskTimeoutException) { log.error(e, "Timeout waiting for scheduler to enqueue job"); } else { log.error(e, "Failed to enqueue job"); } throw new ClientException(e); } } @Override public Collection<Job> getJobs() throws ClientException { try { JobSummary jobSummary = (JobSummary) Await.result( ask(scheduler, SimpleMessage.JOB_SUMMARY, new Timeout( settings.SCHEDULER_TIMEOUT)), settings.SCHEDULER_TIMEOUT); return jobSummary.getJobs(); } catch (AskTimeoutException e) { log.error(e, "Timeout waiting for scheduler to respond with job summary"); throw new ClientException(e); } catch (Exception e) { log.error(e, "Failed to retrieve job summary"); throw new ClientException(e); } } }