Kursinhalt
Multithreading in Java
Multithreading in Java
Herausforderung CompletableFuture
Aufgabe
Ihre Aufgabe ist es, ein System zu entwickeln, das Bestellungen bearbeitet und zusätzliche Berechnungen wie Steuer- und Versandkosten durchführt. Sie müssen mehrere Bestellungen asynchron verarbeiten, die notwendigen Berechnungen durchführen und den Gesamtbetrag für jede Bestellung anzeigen, sobald alle Berechnungen abgeschlossen sind.
Jede Bestellung hat eine eindeutige Kennung und einen Preis, der damit verbunden ist. (InitMap Klasse)
Die ID und ihre Summen werden in einer Map
innerhalb der InitMap
Klasse gespeichert. Die Schlüssel dieser Map
(die die Bestell-ID sind) sind diejenigen, durch die wir in der processOrders()
Methode schleifen.
Das Abrufen von Bestelldaten erfolgt asynchron und gibt den Bestellbetrag zurück. Dies wird von der OrderService
Klasse gehandhabt, insbesondere von der fetchOrderAmount(String orderId)
Methode.
Steuern werden als 15% des Bestellbetrags berechnet. Dies wird von der CalculationService
Klasse verwaltet, die die calculateTax()
Methode verwendet.
Die Versandkosten werden als 10% des Bestellbetrags berechnet. Dies wird ebenfalls von der CalculationService
Klasse gehandhabt, die die calculateShipping()
Methode verwendet.
Hinweis
Ihre Hauptaufgabe besteht darin, die Logik Schritt für Schritt im Paket
task
KlasseOrderProcessingExample
in derprocessOrders()
Methode zu implementieren.
Implementierungsschritte
1. Empfangen Sie den Bestellbetrag asynchron über den Bestellservice:
- Erstellen Sie ein
CompletableFuture
-Objekt, um den Bestellbetrag asynchron abzurufen; - Rufen Sie die Methode
fetchOrderAmount()
vonOrderService
auf und übergeben Sie die Bestell-ID.
Hinweis
Die Methode
fetchOrderAmount()
verwendetCompletableFuture.supplyAsync()
, um die Aufgabe asynchron auszuführen und gibt den Bestellbetrag anhand seiner ID zurück.
2. Berechnen Sie nach dem Abrufen des Bestellbetrags asynchron die Steuer mit dem Berechnungsservice:
- Verwenden Sie
thenCompose()
, um die Aufgabe sequentiell nach Erhalt des Bestellbetrags auszuführen. Rufen Sie die MethodecalculateTax()
vonCalculationService
auf und übergeben Sie den Bestellbetrag.
Hinweis
Die Methode
calculateTax()
verwendetCompletableFuture.supplyAsync()
, um die Aufgabe asynchron auszuführen und gibt eine Steuer in Höhe von 15% des Bestellbetrags zurück.
3. Berechnen Sie nach dem Erhalt des Bestellbetrags asynchron die Versandkosten mit dem Berechnungsservice:
- Verwenden Sie
thenCompose()
, um die Aufgabe sequentiell nach Erhalt des Bestellbetrags auszuführen. Rufen Sie die MethodecalculateShipping
vonCalculationService
auf und übergeben Sie den Bestellbetrag.
Hinweis
Die Methode
calculateShipping()
verwendetCompletableFuture.supplyAsync()
, um die Aufgabe asynchron auszuführen und gibt Versandkosten in Höhe von 10% des Bestellbetrags zurück.
4. Kombinieren Sie die asynchronen Steuer- und Versandkostenberechnungen, um die gesamten zusätzlichen Kosten zu erhalten:
- Verwenden Sie
thenCombine()
, um zweiCompletableFuture
-Ergebnisse von Steuer und Versand zu kombinieren, um die gesamten zusätzlichen Kosten (Steuer + Versandkosten) zu erhalten.
5. Kombinieren Sie den Bestellbetrag und die gesamten zusätzlichen Kosten, um den gesamten Bestellbetrag zu erhalten:
- Verwenden Sie
thenCombine()
, um die beidenCompletableFuture
-Ergebnisse der zusätzlichen Kosten und der gesamten zusätzlichen Kosten und des gesamten Bestellbetrags zu kombinieren, um den gesamten Bestellbetrag zu erhalten.
6. Geben Sie nach der Berechnung des Gesamtergebnisses dieses auf der Konsole aus:
- Verwenden Sie
thenAccept()
, um das Ergebnis zu verarbeiten und auszugeben; - Geben Sie nach Abschluss aller Berechnungen das Bestellgesamtergebnis auf der Konsole aus.
Um das Ergebnis auf der Konsole auszugeben, können Sie dieses Muster verwenden:
Wenn Sie alles korrekt befolgen, erhalten Sie diese Ausgabe in der Konsole:
Sobald Sie sicher sind, dass alles funktioniert, führen Sie die Verifikationstests auf dem Pfad /src/test/java/OrderProcessingExampleTest.java
aus.
Danke für Ihr Feedback!