Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Herausforderung: CompletableFuture | Multithreading Best Practices
Multithreading in Java

bookHerausforderung: CompletableFuture

Aufgabe

Ziel ist der Aufbau eines Systems zur Bearbeitung von Bestellungen und zur Durchführung zusätzlicher Berechnungen wie Steuern und Versandkosten. Erforderlich ist die asynchrone Verarbeitung mehrerer Bestellungen, die Durchführung der notwendigen Berechnungen sowie die Anzeige des Gesamtbetrags für jede Bestellung, sobald alle Berechnungen abgeschlossen sind.

Jede Bestellung verfügt über eine eindeutige Kennung und einen zugehörigen Preis. (InitMap-Klasse)

Die ID und deren Summen werden in einer Map innerhalb der Klasse InitMap gespeichert. Die Schlüssel dieser Map (die Bestell-ID) werden in der Methode processOrders() durchlaufen.

Das Abrufen der Bestelldaten erfolgt asynchron und liefert den Bestellbetrag zurück. Dies wird von der Klasse OrderService übernommen, insbesondere von der Methode fetchOrderAmount(String orderId).

Steuer wird als 15 % des Bestellbetrags berechnet. Dies wird von der Klasse CalculationService mit der Methode calculateTax() durchgeführt.

Die Versandkosten werden als 10 % des Bestellbetrags berechnet. Auch dies übernimmt die Klasse CalculationService mit der Methode calculateShipping().

Note
Hinweis

Die Hauptaufgabe besteht darin, die Logik schrittweise im Package task in der Klasse OrderProcessingExample in der Methode processOrders() zu implementieren.

Implementierungsschritte

1. Den Bestellbetrag asynchron mit dem Order Service abrufen:

  • Ein CompletableFuture-Objekt erstellen, um den Bestellbetrag asynchron abzurufen;
  • Die Methode fetchOrderAmount() aus OrderService mit der Bestell-ID aufrufen.
Note
Hinweis

Die Methode fetchOrderAmount() verwendet CompletableFuture.supplyAsync(), um die Aufgabe asynchron auszuführen und gibt den Bestellbetrag anhand der ID zurück.

2. Nach dem Abrufen des Bestellbetrags asynchrone Berechnung der Steuer mit dem Berechnungsdienst:

  • Verwendung von thenCompose(), um die Aufgabe nach dem Erhalt des Bestellbetrags sequentiell auszuführen. Aufruf der Methode calculateTax() aus dem CalculationService unter Übergabe des Bestellbetrags.
Note
Hinweis

Die Methode calculateTax() verwendet CompletableFuture.supplyAsync(), um die Aufgabe asynchron auszuführen und gibt eine Steuer in Höhe von 15% des Bestellbetrags zurück.

3. Nach Erhalt des Bestellbetrags die Versandkosten asynchron mit dem Berechnungsservice berechnen:

  • Verwenden von thenCompose(), um die Aufgabe nach Erhalt des Bestellbetrags sequenziell auszuführen. Die Methode calculateShipping aus CalculationService mit dem Bestellbetrag aufrufen.
Note
Hinweis

Die Methode calculateShipping() verwendet CompletableFuture.supplyAsync(), um die Aufgabe asynchron auszuführen und gibt Versandkosten zurück, die 10 % des Bestellbetrags entsprechen.

4. Asynchrone Berechnung von Steuer und Versandkosten kombinieren, um die gesamten Zusatzkosten zu erhalten:

  • Verwenden von thenCombine(), um zwei CompletableFuture-Ergebnisse von Steuer und Versandkosten zu kombinieren und die gesamten Zusatzkosten (Steuer + Versandkosten) zu berechnen.

5. Bestellbetrag und Gesamtkosten kombinieren, um den Gesamtbestellwert zu erhalten:

  • Verwenden von thenCombine(), um die beiden CompletableFuture-Ergebnisse von Zusatzkosten und Gesamtbestellwert zu kombinieren und so den Gesamtbestellwert zu berechnen.

6. Nach der Berechnung des Gesamtbetrags diesen in der Konsole ausgeben:

  • Verwenden von thenAccept(), um das Ergebnis zu verarbeiten und auszugeben;
  • Nach Abschluss aller Berechnungen den Gesamtbestellwert in der Konsole ausgeben.

Um das Ergebnis auszugeben, kann folgendes Muster verwendet werden:

System.out.println("Final total for " + orderId + ": " + finalTotal);

Wenn alle Schritte korrekt ausgeführt wurden, erscheint folgende Ausgabe in der Konsole:

Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0

Sobald sichergestellt ist, dass alles funktioniert, die Überprüfungstests im Pfad /src/test/java/OrderProcessingExampleTest.java ausführen.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 7

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

Can you explain how to implement the asynchronous order processing in code?

What should the structure of the InitMap, OrderService, and CalculationService classes look like?

Can you walk me through an example of processing a single order step by step?

Awesome!

Completion rate improved to 3.33

bookHerausforderung: CompletableFuture

Swipe um das Menü anzuzeigen

Aufgabe

Ziel ist der Aufbau eines Systems zur Bearbeitung von Bestellungen und zur Durchführung zusätzlicher Berechnungen wie Steuern und Versandkosten. Erforderlich ist die asynchrone Verarbeitung mehrerer Bestellungen, die Durchführung der notwendigen Berechnungen sowie die Anzeige des Gesamtbetrags für jede Bestellung, sobald alle Berechnungen abgeschlossen sind.

Jede Bestellung verfügt über eine eindeutige Kennung und einen zugehörigen Preis. (InitMap-Klasse)

Die ID und deren Summen werden in einer Map innerhalb der Klasse InitMap gespeichert. Die Schlüssel dieser Map (die Bestell-ID) werden in der Methode processOrders() durchlaufen.

Das Abrufen der Bestelldaten erfolgt asynchron und liefert den Bestellbetrag zurück. Dies wird von der Klasse OrderService übernommen, insbesondere von der Methode fetchOrderAmount(String orderId).

Steuer wird als 15 % des Bestellbetrags berechnet. Dies wird von der Klasse CalculationService mit der Methode calculateTax() durchgeführt.

Die Versandkosten werden als 10 % des Bestellbetrags berechnet. Auch dies übernimmt die Klasse CalculationService mit der Methode calculateShipping().

Note
Hinweis

Die Hauptaufgabe besteht darin, die Logik schrittweise im Package task in der Klasse OrderProcessingExample in der Methode processOrders() zu implementieren.

Implementierungsschritte

1. Den Bestellbetrag asynchron mit dem Order Service abrufen:

  • Ein CompletableFuture-Objekt erstellen, um den Bestellbetrag asynchron abzurufen;
  • Die Methode fetchOrderAmount() aus OrderService mit der Bestell-ID aufrufen.
Note
Hinweis

Die Methode fetchOrderAmount() verwendet CompletableFuture.supplyAsync(), um die Aufgabe asynchron auszuführen und gibt den Bestellbetrag anhand der ID zurück.

2. Nach dem Abrufen des Bestellbetrags asynchrone Berechnung der Steuer mit dem Berechnungsdienst:

  • Verwendung von thenCompose(), um die Aufgabe nach dem Erhalt des Bestellbetrags sequentiell auszuführen. Aufruf der Methode calculateTax() aus dem CalculationService unter Übergabe des Bestellbetrags.
Note
Hinweis

Die Methode calculateTax() verwendet CompletableFuture.supplyAsync(), um die Aufgabe asynchron auszuführen und gibt eine Steuer in Höhe von 15% des Bestellbetrags zurück.

3. Nach Erhalt des Bestellbetrags die Versandkosten asynchron mit dem Berechnungsservice berechnen:

  • Verwenden von thenCompose(), um die Aufgabe nach Erhalt des Bestellbetrags sequenziell auszuführen. Die Methode calculateShipping aus CalculationService mit dem Bestellbetrag aufrufen.
Note
Hinweis

Die Methode calculateShipping() verwendet CompletableFuture.supplyAsync(), um die Aufgabe asynchron auszuführen und gibt Versandkosten zurück, die 10 % des Bestellbetrags entsprechen.

4. Asynchrone Berechnung von Steuer und Versandkosten kombinieren, um die gesamten Zusatzkosten zu erhalten:

  • Verwenden von thenCombine(), um zwei CompletableFuture-Ergebnisse von Steuer und Versandkosten zu kombinieren und die gesamten Zusatzkosten (Steuer + Versandkosten) zu berechnen.

5. Bestellbetrag und Gesamtkosten kombinieren, um den Gesamtbestellwert zu erhalten:

  • Verwenden von thenCombine(), um die beiden CompletableFuture-Ergebnisse von Zusatzkosten und Gesamtbestellwert zu kombinieren und so den Gesamtbestellwert zu berechnen.

6. Nach der Berechnung des Gesamtbetrags diesen in der Konsole ausgeben:

  • Verwenden von thenAccept(), um das Ergebnis zu verarbeiten und auszugeben;
  • Nach Abschluss aller Berechnungen den Gesamtbestellwert in der Konsole ausgeben.

Um das Ergebnis auszugeben, kann folgendes Muster verwendet werden:

System.out.println("Final total for " + orderId + ": " + finalTotal);

Wenn alle Schritte korrekt ausgeführt wurden, erscheint folgende Ausgabe in der Konsole:

Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0

Sobald sichergestellt ist, dass alles funktioniert, die Überprüfungstests im Pfad /src/test/java/OrderProcessingExampleTest.java ausführen.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 7
some-alt