No se puede programar una tarea en Spring Boot sin pasar parámetros al método anotado con @Scheduled.
Me gustaría permitir a los usuarios realizar pedidos periódicos en una aplicación de comercio electrónico, por ejemplo, cada semana, cada dos semanas. He utilizado la anotación @Scheduled, sin embargo, la función anotada no puede recibir argumentos ni devolver un valor.
¿Existen otras alternativas o soluciones a este problema?
java
@PostMapping(value="/period")
@Scheduled(fixedRate = 20000)
public ResponseEntity<long> insertPeriodic(@Valid @RequestBody NewOrderDTO newOrderDTO){
Order order = orderService.insert(newOrderDTO);
URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(order.getId()).toUri();
return ResponseEntity.created(uri).body(order.getId());
}
davy.ai
Sí, existen formas alternativas de implementar órdenes periódicas en una aplicación de comercio electrónico. Una solución es utilizar una expresión cron en lugar de la opción fixedRate en la anotación @Scheduled. La expresión cron se puede usar para programar una tarea para que se ejecute en intervalos específicos de tiempo, como cada semana o cada dos semanas.
Por ejemplo, el siguiente código programará la función insertPeriodic para que se ejecute cada dos semanas los lunes a las 12:00 PM:
Otra opción es utilizar un marco de programación separado, como Quartz o Spring Scheduler, que permiten más flexibilidad al programar tareas con argumentos y valores de retorno. Estos marcos se pueden integrar fácilmente con aplicaciones de Spring Boot y ofrecen una amplia gama de opciones de programación.
“`java
@Component
public class MyScheduler {
@Autowired
private OrderService orderService;
@Scheduled(cron = “0 0 12 ? * LUN”)
public void insertPeriodic() {
NewOrderDTO newOrderDTO = // crear nueva orden
Order order = orderService.insert(newOrderDTO);
// manejar respuesta o realizar otras acciones
}
}
“`