package models.com.mc.workers;
import akka.actor.ActorRef;
import akka.actor.Scheduler;
import akka.actor.UntypedActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import scala.concurrent.ExecutionContext;
import scala.concurrent.duration.Duration;
import scala.concurrent.forkjoin.ThreadLocalRandom;
import java.util.UUID;
import static models.com.mc.workers.Frontend.NotOk;
import static models.com.mc.workers.Frontend.Ok;
//import models.com.mc.workers.Master.Work;
/**
* @deprecated to be removed
* Work Producing done at MainController
*/
public class WorkProducer extends UntypedActor {
private final ActorRef frontend;
public WorkProducer(ActorRef frontend) {
this.frontend = frontend;
}
private LoggingAdapter log = Logging.getLogger(getContext().system(), this);
private Scheduler scheduler = getContext().system().scheduler();
private ExecutionContext ec = getContext().system().dispatcher();
private ThreadLocalRandom rnd = ThreadLocalRandom.current();
private String nextWorkId() {
return UUID.randomUUID().toString();
}
int n = 0;
@Override
public void preStart(){
scheduler.scheduleOnce(Duration.create(5, "seconds"), getSelf(), Tick, ec, getSelf());
}
// override postRestart so we don't call preStart and schedule a new Tick
@Override
public void postRestart(Throwable reason) {
}
@Override
public void onReceive(Object message) {
if (message == Tick) {
n += 1;
log.info("Produced work: {}", n);
Work work = new Work(nextWorkId(), n+"");
frontend.tell(work, getSelf());
getContext().become(waitAccepted(work), false);
}
else {
unhandled(message);
}
}
private Behavior waitAccepted(final Work work) {
return new Behavior() {
@Override
public void apply(Object message) {
if (message instanceof Ok) {
getContext().unbecome();
scheduler.scheduleOnce(Duration.create(rnd.nextInt(3, 10), "seconds"), getSelf(), Tick, ec, getSelf());
}
else if (message instanceof NotOk) {
log.info("Work not accepted, retry after a while");
scheduler.scheduleOnce(Duration.create(3, "seconds"), frontend, work, ec, getSelf());
}
else {
unhandled(message);
}
}
};
}
private static final Object Tick = new Object() {
@Override
public String toString() {
return "Tick";
}
};
}