MNP_Projekt_1/src/main/java/com/example/AddressBook.java

62 lines
2.3 KiB
Java

package com.example;
import akka.actor.typed.ActorRef;
import akka.actor.typed.Behavior;
import akka.actor.typed.javadsl.AbstractBehavior;
import akka.actor.typed.javadsl.ActorContext;
import akka.actor.typed.javadsl.Behaviors;
import akka.actor.typed.javadsl.Receive;
import java.util.ArrayList;
import java.util.Random;
public class AddressBook extends AbstractBehavior<AddressBook.Message> {
ArrayList<ActorRef<Customer.Message>> customers = new ArrayList<>();
public interface Message {}
// Nachricht, wenn ein Empfänger nach einer Adresse fragt
public static final class CustomerMessage implements Message {
public final ActorRef<Customer.Message> fragender;
public final String nameFragender;
public final ActorRef<DeliveryCar.Message> truckReference;
public CustomerMessage(ActorRef<Customer.Message> fragender, String nameFragender, ActorRef<DeliveryCar.Message> truckReference) {
this.fragender = fragender;
this.nameFragender = nameFragender;
this.truckReference = truckReference;
}
}
private AddressBook(ActorContext<Message> context, ArrayList<ActorRef<Customer.Message>> custo) {
super(context);
if (!custo.isEmpty()) {
this.customers.addAll(custo);
for (ActorRef<Customer.Message> cst : this.customers) {
cst.tell(new Customer.AddressHello(getContext().getSelf()));
}
}
}
public static Behavior<Message> create(ArrayList<ActorRef<Customer.Message>> custo) {
return Behaviors.setup(context -> new AddressBook(context, custo));
}
@Override
public Receive<Message> createReceive() {
return newReceiveBuilder()
.onMessage(CustomerMessage.class, this::onCustomerMessage)
.build();
}
// Methode, um einen zufälligen Empfänger auszugeben
private Behavior<Message> onCustomerMessage(CustomerMessage msg) {
Random random = new Random();
int index = random.nextInt(customers.size());
ActorRef<Customer.Message> addressOf = customers.get(index);
getContext().getLog().info("{} asked for an address", msg.nameFragender);
msg.fragender.tell(new Customer.AddressMessage(addressOf, msg.truckReference));
return this;
}
}