Überarbeitung von DelieveryCar sowie deren Methoden,

was noch fehlt ist die StartMessage von DistributionCenter aus und die TimeScheduler beim DeliveryCar
This commit is contained in:
de1008 2024-05-17 19:11:06 +02:00
parent 50c4920d4b
commit 149f3e7141
14 changed files with 91 additions and 27 deletions

View File

@ -31,9 +31,13 @@ public class AkkaMainSystem extends AbstractBehavior<AkkaMainSystem.Create> {
// Erstellen des Adressbuchs // Erstellen des Adressbuchs
ArrayList<ActorRef<Customer.Message>> customers = new ArrayList<>(); ArrayList<ActorRef<Customer.Message>> customers = new ArrayList<>();
// Erstellen von vier Empfänger*innen // Erstellen von vier Empfänger*innen
for (int i = 0; i < 4; i++) { /* for (int i = 0; i < 4; i++) {
customers.add(getContext().spawn(Customer.create("Customer" + (i + 1)), "customer" + (i + 1))); customers.add(getContext().spawn(Customer.create("Customer" + (i + 1)), "customer" + (i + 1)));
} }*/
customers.add(getContext().spawn(Customer.create("Alice"+( 1)) ,"alice"+(1)));
customers.add(getContext().spawn(Customer.create("Bob"+( 1)) ,"bob"+(1)));
customers.add(getContext().spawn(Customer.create("Charles"+( 1)) ,"charles"+(1)));
customers.add(getContext().spawn(Customer.create("Derick"+( 1)) ,"derick"+(1)));
ActorRef<AddressBook.Message> addressBook = getContext().spawn(AddressBook.create(customers), "addressBook"); ActorRef<AddressBook.Message> addressBook = getContext().spawn(AddressBook.create(customers), "addressBook");
// Nachricht GetCustomers senden, um Kundenreferenzen abzurufen // Nachricht GetCustomers senden, um Kundenreferenzen abzurufen

View File

@ -77,7 +77,14 @@ public class Customer extends AbstractBehavior<Customer.Message> {
if(number <= 80){ if(number <= 80){
//truck wird hier übergeben, damit man im nächsten Schritt wieder auf ihn zugreifen kann. //truck wird hier übergeben, damit man im nächsten Schritt wieder auf ihn zugreifen kann.
this.adrBook.tell(new AddressBook.CustomerMessage(getContext().getSelf(), this.name, msg.truckReference)); this.adrBook.tell(new AddressBook.CustomerMessage(getContext().getSelf(), this.name, msg.truckReference));
//Methode um einen Paket zu versenden
//über onAddressMessage wird dann Paket aufgenommen
onAddressMessage(new AddressMessage(getContext().getSelf(), msg.truckReference));
}else{ }else{
getContext().getLog().info("Kunde {}, will kein Paket abschicken", this.name);
msg.truckReference.tell(new DeliveryCar.PickupResponse(null)); msg.truckReference.tell(new DeliveryCar.PickupResponse(null));
} }
return this; return this;

View File

@ -6,6 +6,7 @@ import akka.actor.typed.javadsl.AbstractBehavior;
import akka.actor.typed.javadsl.ActorContext; import akka.actor.typed.javadsl.ActorContext;
import akka.actor.typed.javadsl.Behaviors; import akka.actor.typed.javadsl.Behaviors;
import akka.actor.typed.javadsl.Receive; import akka.actor.typed.javadsl.Receive;
import akka.actor.typed.javadsl.TimerScheduler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -15,6 +16,7 @@ public class DeliveryCar extends AbstractBehavior<DeliveryCar.Message> {
private final ArrayList<Paket> pakete = new ArrayList<>(); private final ArrayList<Paket> pakete = new ArrayList<>();
private final ArrayList<ActorRef<Customer.Message>> route; private final ArrayList<ActorRef<Customer.Message>> route;
private final int maxCapacity = 3; private final int maxCapacity = 3;
private int globalIndex = 0;
public interface Message {} public interface Message {}
@ -22,7 +24,9 @@ public class DeliveryCar extends AbstractBehavior<DeliveryCar.Message> {
public record PickupResponse(Paket paket) implements Message {} public record PickupResponse(Paket paket) implements Message {}
public record ContinueRoute() implements Message {} public record StartRoute() implements Message {}
public record RestartRoute() implements Message{}
private DeliveryCar(ActorContext<Message> context, ArrayList<ActorRef<Customer.Message>> route) { private DeliveryCar(ActorContext<Message> context, ArrayList<ActorRef<Customer.Message>> route) {
super(context); super(context);
@ -38,10 +42,8 @@ public class DeliveryCar extends AbstractBehavior<DeliveryCar.Message> {
return newReceiveBuilder() return newReceiveBuilder()
.onMessage(LoadMessage.class, this::onLoadMessage) .onMessage(LoadMessage.class, this::onLoadMessage)
.onMessage(PickupResponse.class, this::onPickupResponse) .onMessage(PickupResponse.class, this::onPickupResponse)
.onMessage(ContinueRoute.class, msg -> { .onMessage(StartRoute.class, msg->{
deliverPackages(); onStartRoute();return this;})
return Behaviors.same();
})
.build(); .build();
} }
@ -52,30 +54,81 @@ public class DeliveryCar extends AbstractBehavior<DeliveryCar.Message> {
} }
private Behavior<Message> onPickupResponse(PickupResponse rsp) { private Behavior<Message> onPickupResponse(PickupResponse rsp) {
pakete.add(rsp.paket); if(rsp.paket.inhalt == null){
getContext().getLog().info("Aktuelle Anzahl der Pakete im Truck: {}", pakete.size()); globalIndex++;
checkNextStop(); checkNextStop();
}else {
if(pakete.size()==3){
checkNextStop();
}
pakete.add(rsp.paket);
getContext().getLog().info("Aktuelle Anzahl der Pakete im Truck: {}", pakete.size());
globalIndex++;
checkNextStop();
}
return this; return this;
} }
//Die rekursive Methode,die über alle Addressen iteriert
private void checkNextStop() { private void checkNextStop() {
if (pakete.size() >= maxCapacity || route.isEmpty()) { //Wenn Wagen voll ist, dann wird erstmal geguckt ob man ein Paket liefern kann
getContext().getSelf().tell(new ContinueRoute()); if (pakete.size() >= maxCapacity) {
} else { deliverPackages();
checkNextStop();
}
//Wenn fertig iteriert so geht der Wagen an den Verteilerzentrum
if(globalIndex==4){
DistributionCenter.ArriveMessage antwort = new DistributionCenter.ArriveMessage(pakete,getContext().getSelf());
//Fehlende Antwort an den Verteilerzentrum
//
}
else {
//Guckt ob Paket für Kunden da ist und fragt an ob etwas mitgenommen werden muss
deliverPackages();
sendPickupMessage(); sendPickupMessage();
} }
} }
private Behavior<Message> onStartRoute(){
private void sendPickupMessage() { if(globalIndex==0){
ActorRef<Customer.Message> nextCustomer = route.remove(0); checkNextStop();
nextCustomer.tell(new Customer.PickUpMessage(getContext().getSelf(), "Some string")); return this;
} }else{
if(globalIndex==4) {
private void deliverPackages() { globalIndex = 0;
ActorRef<Customer.Message> nextCustomer = route.get(0); onStartRoute();
for (Paket paket : pakete) { }
nextCustomer.tell(new Customer.DeliveryMessage(paket));
} }
pakete.clear(); return this;
} }
//Sendet PickUp Nachricht an den jetztigen Kunden wo der gerade ist.
private void sendPickupMessage() {
ActorRef<Customer.Message> nextCustomer = route.get(globalIndex);
nextCustomer.tell(new Customer.PickUpMessage(getContext().getSelf(), "Wagen kann Paket aufnehmen"));
globalIndex++;
}
//Prüft ob Paket im Wagen für den Empfänger ist oder nicht, falls ja wird dieser direkt entfernt
private void deliverPackages() {
ActorRef<Customer.Message> nextCustomer = route.get(globalIndex);
//Iteriert über alle Pakete
for (Paket paket : pakete) {
//Falls Empfänger vorhanden so wird dieser aus dem Wagen genommen und geht dann weiter
if(pakete.get(globalIndex).empfaenger == nextCustomer ) {
nextCustomer.tell(new Customer.DeliveryMessage(paket));
pakete.remove(globalIndex);
globalIndex++;
}
}
}
private void removeMessage(Paket paket){
pakete.remove(paket);
}
} }

View File

@ -137,8 +137,8 @@ public class DistributionCenter extends AbstractBehavior<DistributionCenter.Mess
// Erstelle vier Lastwagen mit zufälligen Routen // Erstelle vier Lastwagen mit zufälligen Routen
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
List<ActorRef<Customer.Message>> route = generateRandomRoute(customers); List<ActorRef<Customer.Message>> route = generateRandomRoute(customers);
getContext().spawn(DeliveryCar.create(route), "deliveryCar" + i); getContext().spawn(DeliveryCar.create(route), "deliveryCar" + i+1);
getContext().getLog().info("Lieferwagen {} erstellt mit Route: {}", i, route); getContext().getLog().info("Lieferwagen {} erstellt mit Route: {}", i+1, route.toString());
} }
} }