blatt02/src/main/java/com/example/RelayBot.java
2024-05-05 13:20:20 +02:00

56 lines
1.7 KiB
Java

package com.example;
import akka.actor.typed.ActorRef;
import akka.actor.typed.Behavior;
import akka.actor.typed.javadsl.*;
import java.util.ArrayList;
import java.util.List;
public class RelayBot extends AbstractBehavior<RelayBot.Message> {
public interface Message {};
public record Hello(List<ActorRef<RelayBot.Message>> reihenfolge, int count) implements Message { }
public record Start(List<ActorRef<Message>> reihenfolge) implements Message { }
public static Behavior<Message> create(String name) {
return Behaviors.setup(context -> new RelayBot(context, name));
}
private final String name;
private RelayBot(ActorContext<Message> context, String name) {
super(context);
this.name = name;
}
@Override
public Receive<Message> createReceive() {
return newReceiveBuilder()
.onMessage(Hello.class, this::onHello)
.onMessage(Start.class, this::onStart)
.build();
}
private Behavior<Message> onStart(Start msg) {
var next_hop = msg.reihenfolge.remove(0);
var new_reihenfolge = new ArrayList<>(msg.reihenfolge);
new_reihenfolge.add(next_hop);
next_hop.tell(new Hello(new_reihenfolge, 1));
return this;
}
private Behavior<Message> onHello(Hello msg) {
if (msg.count > 15) {
return Behaviors.stopped();
}
getContext().getLog().info("I, {}, got Hello ({})", this.name, msg.count);
var next_hop = msg.reihenfolge.remove(0);
var new_reihenfolge = new ArrayList<>(msg.reihenfolge);
new_reihenfolge.add(next_hop);
next_hop.tell(new Hello(new_reihenfolge, msg.count + 1));
return this;
}
}