Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Desafío: CompletableFuture | Mejores Prácticas de Multithreading
Multithreading en Java

bookDesafío: CompletableFuture

Tarea

El objetivo es construir un sistema que gestione pedidos y realice cálculos adicionales como impuestos y costos de envío. Se requiere procesar múltiples pedidos de forma asíncrona, efectuar los cálculos necesarios y mostrar el monto total de cada pedido una vez que todas las operaciones hayan finalizado.

Cada pedido tiene un identificador único y un precio asociado. (Clase InitMap)

El ID y sus sumas se almacenan en un Map dentro de la clase InitMap. Las claves de este Map (que son los ID de los pedidos) son las que se recorren en el método processOrders().

La obtención de datos de los pedidos se realiza de forma asíncrona y devuelve el monto del pedido. Esto es gestionado por la clase OrderService, específicamente por el método fetchOrderAmount(String orderId).

El impuesto se calcula como el 15% del monto del pedido. Esto es gestionado por la clase CalculationService, utilizando el método calculateTax().

El costo de envío se calcula como el 10% del monto del pedido. Esto también es gestionado por la clase CalculationService, utilizando el método calculateShipping().

Note
Nota

La tarea principal consiste en implementar la lógica paso a paso en el paquete task, clase OrderProcessingExample, en el método processOrders().

Pasos de implementación

1. Recibir el monto del pedido de forma asíncrona utilizando el servicio de pedidos:

  • Crear un objeto CompletableFuture para obtener el monto del pedido de forma asíncrona;
  • Llamar al método fetchOrderAmount() de OrderService pasando el order id.
Note
Nota

El método fetchOrderAmount() utiliza CompletableFuture.supplyAsync() para realizar la tarea de forma asíncrona y devuelve el monto del pedido, según su id.

2. Después de obtener el monto del pedido, calcular de forma asíncrona el impuesto utilizando el servicio de cálculo:

  • Utilizar thenCompose() para ejecutar la tarea de manera secuencial después de obtener el monto del pedido. Llamar al método calculateTax() de CalculationService pasando el monto del pedido.
Note
Nota

El método calculateTax() utiliza CompletableFuture.supplyAsync() para ejecutar la tarea de forma asíncrona y devuelve un impuesto igual al 15% del monto del pedido.

3. Después de recibir el monto del pedido, calcular de forma asíncrona el costo de envío utilizando el servicio de cálculo:

  • Utilizar thenCompose() para ejecutar la tarea secuencialmente después de recibir el monto del pedido. Llamar al método calculateShipping de CalculationService pasando el monto del pedido.
Note
Nota

El método calculateShipping() utiliza CompletableFuture.supplyAsync() para ejecutar la tarea de forma asíncrona y retorna un costo de envío igual al 10% del monto del pedido.

4. Combinar los cálculos asíncronos de impuestos y costo de envío para obtener el costo incremental total:

  • Utilizar thenCombine() para combinar dos resultados de CompletableFuture de impuestos y envío para obtener el costo adicional total (impuestos + costo de envío).

5. Combinar el monto del pedido y el costo adicional total para obtener el monto total del pedido:

  • Utilizar thenCombine() para combinar los dos resultados de CompletableFuture de costo adicional y monto total adicional y monto total del pedido para obtener el monto total del pedido.

6. Después de calcular el total, mostrarlo en la consola:

  • Utilizar thenAccept() para procesar y mostrar el resultado;
  • Después de completar todos los cálculos, mostrar el total del pedido en la consola.

Para mostrar el resultado en la consola, se puede utilizar este patrón:

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

Si se sigue todo correctamente, se obtendrá esta salida en la consola:

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

Una vez verificado que todo funciona correctamente, ejecutar las pruebas de verificación en la ruta /src/test/java/OrderProcessingExampleTest.java.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 7

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

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

bookDesafío: CompletableFuture

Desliza para mostrar el menú

Tarea

El objetivo es construir un sistema que gestione pedidos y realice cálculos adicionales como impuestos y costos de envío. Se requiere procesar múltiples pedidos de forma asíncrona, efectuar los cálculos necesarios y mostrar el monto total de cada pedido una vez que todas las operaciones hayan finalizado.

Cada pedido tiene un identificador único y un precio asociado. (Clase InitMap)

El ID y sus sumas se almacenan en un Map dentro de la clase InitMap. Las claves de este Map (que son los ID de los pedidos) son las que se recorren en el método processOrders().

La obtención de datos de los pedidos se realiza de forma asíncrona y devuelve el monto del pedido. Esto es gestionado por la clase OrderService, específicamente por el método fetchOrderAmount(String orderId).

El impuesto se calcula como el 15% del monto del pedido. Esto es gestionado por la clase CalculationService, utilizando el método calculateTax().

El costo de envío se calcula como el 10% del monto del pedido. Esto también es gestionado por la clase CalculationService, utilizando el método calculateShipping().

Note
Nota

La tarea principal consiste en implementar la lógica paso a paso en el paquete task, clase OrderProcessingExample, en el método processOrders().

Pasos de implementación

1. Recibir el monto del pedido de forma asíncrona utilizando el servicio de pedidos:

  • Crear un objeto CompletableFuture para obtener el monto del pedido de forma asíncrona;
  • Llamar al método fetchOrderAmount() de OrderService pasando el order id.
Note
Nota

El método fetchOrderAmount() utiliza CompletableFuture.supplyAsync() para realizar la tarea de forma asíncrona y devuelve el monto del pedido, según su id.

2. Después de obtener el monto del pedido, calcular de forma asíncrona el impuesto utilizando el servicio de cálculo:

  • Utilizar thenCompose() para ejecutar la tarea de manera secuencial después de obtener el monto del pedido. Llamar al método calculateTax() de CalculationService pasando el monto del pedido.
Note
Nota

El método calculateTax() utiliza CompletableFuture.supplyAsync() para ejecutar la tarea de forma asíncrona y devuelve un impuesto igual al 15% del monto del pedido.

3. Después de recibir el monto del pedido, calcular de forma asíncrona el costo de envío utilizando el servicio de cálculo:

  • Utilizar thenCompose() para ejecutar la tarea secuencialmente después de recibir el monto del pedido. Llamar al método calculateShipping de CalculationService pasando el monto del pedido.
Note
Nota

El método calculateShipping() utiliza CompletableFuture.supplyAsync() para ejecutar la tarea de forma asíncrona y retorna un costo de envío igual al 10% del monto del pedido.

4. Combinar los cálculos asíncronos de impuestos y costo de envío para obtener el costo incremental total:

  • Utilizar thenCombine() para combinar dos resultados de CompletableFuture de impuestos y envío para obtener el costo adicional total (impuestos + costo de envío).

5. Combinar el monto del pedido y el costo adicional total para obtener el monto total del pedido:

  • Utilizar thenCombine() para combinar los dos resultados de CompletableFuture de costo adicional y monto total adicional y monto total del pedido para obtener el monto total del pedido.

6. Después de calcular el total, mostrarlo en la consola:

  • Utilizar thenAccept() para procesar y mostrar el resultado;
  • Después de completar todos los cálculos, mostrar el total del pedido en la consola.

Para mostrar el resultado en la consola, se puede utilizar este patrón:

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

Si se sigue todo correctamente, se obtendrá esta salida en la consola:

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

Una vez verificado que todo funciona correctamente, ejecutar las pruebas de verificación en la ruta /src/test/java/OrderProcessingExampleTest.java.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 7
some-alt