Timer fixed and no locks
This commit is contained in:
parent
4978d4dccf
commit
ef94068bc3
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,3 +1,4 @@
|
||||||
|
// DeliveryCar.java
|
||||||
package com.example;
|
package com.example;
|
||||||
|
|
||||||
import akka.actor.typed.ActorRef;
|
import akka.actor.typed.ActorRef;
|
||||||
|
@ -50,74 +51,61 @@ public class DeliveryCar extends AbstractBehavior<DeliveryCar.Message> {
|
||||||
|
|
||||||
private Behavior<Message> onLoadMessage(LoadMessage msg) {
|
private Behavior<Message> onLoadMessage(LoadMessage msg) {
|
||||||
pakete.addAll(msg.pakete);
|
pakete.addAll(msg.pakete);
|
||||||
scheduleNextStopCheck();
|
getContext().getLog().info("Geladen {} Pakete in den LKW.", msg.pakete.size());
|
||||||
|
scheduleNextStopCheck(Duration.ofSeconds(3)); // Start checking the first stop after 3 seconds
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Behavior<Message> onPickupResponse(PickupResponse rsp) {
|
private Behavior<Message> onPickupResponse(PickupResponse rsp) {
|
||||||
if (rsp.paket == null || rsp.paket.inhalt == null) {
|
if (rsp.paket != null && rsp.paket.inhalt != null && pakete.size() < maxCapacity) {
|
||||||
scheduleNextStopCheck();
|
|
||||||
} else {
|
|
||||||
if (pakete.size() < maxCapacity) {
|
|
||||||
pakete.add(rsp.paket);
|
pakete.add(rsp.paket);
|
||||||
getContext().getLog().info("Current number of packages in the truck: {}", pakete.size());
|
getContext().getLog().info("Ein Paket abgeholt. Aktuelle Anzahl der Pakete im LKW: {}", pakete.size());
|
||||||
}
|
}
|
||||||
scheduleNextStopCheck();
|
scheduleNextStopCheck(Duration.ofSeconds(1)); // Move to the next stop after 1 second
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Behavior<Message> onCheckStop(CheckStop stop) {
|
private Behavior<Message> onCheckStop(CheckStop stop) {
|
||||||
if (globalIndex >= route.size()) {
|
if (globalIndex >= route.size()) {
|
||||||
getContext().getLog().info("Car is returning to the distribution center.");
|
getContext().getLog().info("Der LKW kehrt zum Verteilzentrum zurück.");
|
||||||
DistributionCenter.ArriveMessage antwort = new DistributionCenter.ArriveMessage(pakete, getContext().getSelf());
|
DistributionCenter.ArriveMessage antwort = new DistributionCenter.ArriveMessage(pakete, getContext().getSelf());
|
||||||
getDistributionCenter().tell(antwort);
|
getDistributionCenter().tell(antwort);
|
||||||
|
pakete.clear();
|
||||||
globalIndex = 0;
|
globalIndex = 0;
|
||||||
} else {
|
} else {
|
||||||
getContext().getLog().info("I am at {}", route.get(globalIndex).path().name());
|
ActorRef<Customer.Message> currentStop = route.get(globalIndex);
|
||||||
if (pakete.size() >= maxCapacity) {
|
getContext().getLog().info("Ich bin bei {}", currentStop.path().name());
|
||||||
deliverPackages();
|
deliverPackages(currentStop);
|
||||||
} else {
|
if (pakete.size() < maxCapacity) {
|
||||||
sendPickupMessage();
|
sendPickupMessage(currentStop);
|
||||||
}
|
}
|
||||||
globalIndex++;
|
globalIndex++;
|
||||||
|
scheduleNextStopCheck(pakete.size() >= maxCapacity ? Duration.ofSeconds(1) : Duration.ofSeconds(3));
|
||||||
}
|
}
|
||||||
scheduleNextStopCheck();
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private Behavior<Message> onStartRoute(StartRoute msg) {
|
private Behavior<Message> onStartRoute(StartRoute msg) {
|
||||||
globalIndex = 0;
|
globalIndex = 0;
|
||||||
scheduleNextStopCheck();
|
scheduleNextStopCheck(Duration.ofSeconds(3)); // Start checking the first stop after 3 seconds
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendPickupMessage() {
|
private void sendPickupMessage(ActorRef<Customer.Message> customer) {
|
||||||
if (globalIndex < route.size()) {
|
customer.tell(new Customer.PickUpMessage(getContext().getSelf(), "LKW kann Paket abholen"));
|
||||||
ActorRef<Customer.Message> nextCustomer = route.get(globalIndex);
|
|
||||||
nextCustomer.tell(new Customer.PickUpMessage(getContext().getSelf(), "Car can pick up package"));
|
|
||||||
} else {
|
|
||||||
getContext().getLog().info("No more customers in the route.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deliverPackages() {
|
private void deliverPackages(ActorRef<Customer.Message> customer) {
|
||||||
if (globalIndex < route.size()) {
|
pakete.removeIf(paket -> {
|
||||||
ActorRef<Customer.Message> nextCustomer = route.get(globalIndex);
|
if (paket.empfaenger.equals(customer)) {
|
||||||
for (int i = 0; i < pakete.size(); i++) {
|
customer.tell(new Customer.DeliveryMessage(paket));
|
||||||
Paket paket = pakete.get(i);
|
return true;
|
||||||
if (paket.empfaenger == nextCustomer) {
|
|
||||||
nextCustomer.tell(new Customer.DeliveryMessage(paket));
|
|
||||||
pakete.remove(i);
|
|
||||||
i--; // Adjust index since an element is removed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scheduleNextStopCheck() {
|
private void scheduleNextStopCheck(Duration duration) {
|
||||||
timers.startSingleTimer(new CheckStop(), Duration.ofSeconds(3));
|
timers.startSingleTimer(new CheckStop(), duration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// DistributionCenter.java
|
||||||
package com.example;
|
package com.example;
|
||||||
|
|
||||||
import akka.actor.typed.ActorRef;
|
import akka.actor.typed.ActorRef;
|
||||||
|
@ -19,7 +20,6 @@ public class DistributionCenter extends AbstractBehavior<DistributionCenter.Mess
|
||||||
private final List<Paket> lagerraum = new ArrayList<>();
|
private final List<Paket> lagerraum = new ArrayList<>();
|
||||||
private final List<ActorRef<DeliveryCar.Message>> deliveryCars = new ArrayList<>();
|
private final List<ActorRef<DeliveryCar.Message>> deliveryCars = new ArrayList<>();
|
||||||
|
|
||||||
|
|
||||||
private DistributionCenter(ActorContext<Message> context, ActorRef<AddressBook.Message> addressBook) {
|
private DistributionCenter(ActorContext<Message> context, ActorRef<AddressBook.Message> addressBook) {
|
||||||
super(context);
|
super(context);
|
||||||
this.addressBook = addressBook;
|
this.addressBook = addressBook;
|
||||||
|
@ -65,8 +65,6 @@ public class DistributionCenter extends AbstractBehavior<DistributionCenter.Mess
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static class GenerateRoutes implements Message {
|
public static class GenerateRoutes implements Message {
|
||||||
private final List<ActorRef<Customer.Message>> customers;
|
private final List<ActorRef<Customer.Message>> customers;
|
||||||
|
|
||||||
|
@ -92,14 +90,7 @@ public class DistributionCenter extends AbstractBehavior<DistributionCenter.Mess
|
||||||
// Füge alle Pakete aus der Ankunftsnachricht dem Lagerraum hinzu
|
// Füge alle Pakete aus der Ankunftsnachricht dem Lagerraum hinzu
|
||||||
List<Paket> arrivedPackages = msg.getPakete();
|
List<Paket> arrivedPackages = msg.getPakete();
|
||||||
lagerraum.addAll(arrivedPackages);
|
lagerraum.addAll(arrivedPackages);
|
||||||
String arrivedPackagesString = "";
|
getContext().getLog().info("Angekommene Pakete: {} Anz Packeten in Lager: {}", arrivedPackages.size(), lagerraum.size());
|
||||||
for (int i = 0; i < arrivedPackages.size(); i++) {
|
|
||||||
arrivedPackagesString += arrivedPackages.get(i).inhalt;
|
|
||||||
if (i < arrivedPackages.size() - 1) {
|
|
||||||
arrivedPackagesString += ", "; // Fügen Sie ein Trennzeichen hinzu, außer für das letzte Paket
|
|
||||||
}
|
|
||||||
}
|
|
||||||
getContext().getLog().info("Angekommene Pakete: {} Anz Packeten in Lager: {}", arrivedPackagesString, lagerraum.size());
|
|
||||||
|
|
||||||
// Entferne zufällig 3 Pakete aus dem Lagerraum und sende sie dem angekommenen Wagen
|
// Entferne zufällig 3 Pakete aus dem Lagerraum und sende sie dem angekommenen Wagen
|
||||||
int numPackagesToSend = Math.min(3, lagerraum.size());
|
int numPackagesToSend = Math.min(3, lagerraum.size());
|
||||||
|
@ -115,8 +106,6 @@ public class DistributionCenter extends AbstractBehavior<DistributionCenter.Mess
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private Behavior<Message> onGenerateRoutes(GenerateRoutes msg) {
|
private Behavior<Message> onGenerateRoutes(GenerateRoutes msg) {
|
||||||
List<ActorRef<Customer.Message>> customers = msg.getCustomers();
|
List<ActorRef<Customer.Message>> customers = msg.getCustomers();
|
||||||
generateRoutes(customers);
|
generateRoutes(customers);
|
||||||
|
@ -124,32 +113,28 @@ public class DistributionCenter extends AbstractBehavior<DistributionCenter.Mess
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateRoutes(List<ActorRef<Customer.Message>> customers) {
|
private void generateRoutes(List<ActorRef<Customer.Message>> customers) {
|
||||||
// Überprüfen, ob die Kundenliste null oder leer ist
|
|
||||||
if (customers == null || customers.isEmpty()) {
|
if (customers == null || customers.isEmpty()) {
|
||||||
getContext().getLog().info("Kundenliste ist leer oder null. Keine Routen generiert.");
|
getContext().getLog().info("Kundenliste ist leer oder null. Keine Routen generiert.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Erstelle vier Lastwagen mit zufälligen Routen
|
for (int i = 0; i < 4; i++) { // Erstelle vier Lieferwagen
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
/*List<ActorRef<Customer.Message>> route = generateRandomRoute(customers);
|
|
||||||
getContext().spawn(DeliveryCar.create(route), "deliveryCar" + i+1);
|
|
||||||
getContext().getLog().info("Lieferwagen {} erstellt mit Route: {}", i+1, route.toString());*/
|
|
||||||
List<ActorRef<Customer.Message>> route = generateRandomRoute(customers);
|
List<ActorRef<Customer.Message>> route = generateRandomRoute(customers);
|
||||||
ActorRef<DeliveryCar.Message> deliveryCar = getContext().spawn(DeliveryCar.create(route), "deliveryCar" + (i + 1));
|
ActorRef<DeliveryCar.Message> deliveryCar = getContext().spawn(DeliveryCar.create(route), "deliveryCar" + (i + 1));
|
||||||
|
deliveryCars.add(deliveryCar);
|
||||||
|
|
||||||
String RouteStr = "";
|
StringBuilder routeStr = new StringBuilder();
|
||||||
for (int j = 0; j < route.size(); j++) {
|
for (int j = 0; j < route.size(); j++) {
|
||||||
RouteStr += route.get(j).path().name();
|
routeStr.append(route.get(j).path().name());
|
||||||
if (j < route.size() - 1) {
|
if (j < route.size() - 1) {
|
||||||
RouteStr += ", "; // Fügen Sie ein Trennzeichen hinzu, außer für das letzte Paket
|
routeStr.append(", ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getContext().getLog().info("Lieferwagen {} erstellt mit Route: {}", i + 1, RouteStr);
|
getContext().getLog().info("Lieferwagen {} erstellt mit Route: {}", i + 1, routeStr);
|
||||||
deliveryCar.tell(new DeliveryCar.StartRoute());
|
deliveryCar.tell(new DeliveryCar.StartRoute());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private Behavior<Message> onStartAllRoutes(StartAllRoutes msg) {
|
private Behavior<Message> onStartAllRoutes(StartAllRoutes msg) {
|
||||||
for (ActorRef<DeliveryCar.Message> deliveryCar : deliveryCars) {
|
for (ActorRef<DeliveryCar.Message> deliveryCar : deliveryCars) {
|
||||||
deliveryCar.tell(new DeliveryCar.StartRoute());
|
deliveryCar.tell(new DeliveryCar.StartRoute());
|
||||||
|
@ -157,7 +142,6 @@ public class DistributionCenter extends AbstractBehavior<DistributionCenter.Mess
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dummy-Methode zum Generieren einer zufälligen Route
|
|
||||||
private List<ActorRef<Customer.Message>> generateRandomRoute(List<ActorRef<Customer.Message>> customers) {
|
private List<ActorRef<Customer.Message>> generateRandomRoute(List<ActorRef<Customer.Message>> customers) {
|
||||||
List<ActorRef<Customer.Message>> route = new ArrayList<>(customers);
|
List<ActorRef<Customer.Message>> route = new ArrayList<>(customers);
|
||||||
Collections.shuffle(route);
|
Collections.shuffle(route);
|
||||||
|
|
Loading…
Reference in New Issue