blob: 0aa163b6eeab75a2d6e76eb14929c91a507595e2 [file]
package sample.cluster.stats;
import org.apache.pekko.actor.typed.ActorRef;
import org.apache.pekko.actor.typed.Behavior;
import org.apache.pekko.actor.typed.javadsl.AbstractBehavior;
import org.apache.pekko.actor.typed.javadsl.ActorContext;
import org.apache.pekko.actor.typed.javadsl.Behaviors;
import org.apache.pekko.actor.typed.javadsl.Receive;
import com.fasterxml.jackson.annotation.JsonCreator;
import sample.cluster.CborSerializable;
import java.util.Arrays;
import java.util.List;
public final class StatsService extends AbstractBehavior<StatsService.Command> {
public interface Command extends CborSerializable {}
public final static class ProcessText implements Command {
public final String text;
public final ActorRef<Response> replyTo;
public ProcessText(String text, ActorRef<Response> replyTo) {
this.text = text;
this.replyTo = replyTo;
}
}
public enum Stop implements Command {
INSTANCE
}
interface Response extends CborSerializable { }
public static final class JobResult implements Response {
public final double meanWordLength;
@JsonCreator
public JobResult(double meanWordLength) {
this.meanWordLength = meanWordLength;
}
@Override
public String toString() {
return "JobResult{" +
"meanWordLength=" + meanWordLength +
'}';
}
}
public static final class JobFailed implements Response {
public final String reason;
@JsonCreator
public JobFailed(String reason) {
this.reason = reason;
}
@Override
public String toString() {
return "JobFailed{" +
"reason='" + reason + '\'' +
'}';
}
}
public static Behavior<Command> create(ActorRef<StatsWorker.Process> workers) {
return Behaviors.setup(context ->
new StatsService(context, workers)
);
}
private final ActorRef<StatsWorker.Process> workers;
private StatsService(ActorContext<Command> context, ActorRef<StatsWorker.Process> workers) {
super(context);
this.workers = workers;
}
@Override
public Receive<Command> createReceive() {
return newReceiveBuilder()
.onMessage(ProcessText.class, this::process)
.onMessageEquals(Stop.INSTANCE, () -> Behaviors.stopped())
.build();
}
private Behavior<Command> process(ProcessText command) {
getContext().getLog().info("Delegating request");
List<String> words = Arrays.asList(command.text.split(" "));
getContext().spawnAnonymous(StatsAggregator.create(words, workers, command.replyTo));
return this;
}
}