@Scheduled is fine until it isn't. It runs in one JVM, so the moment you scale to two instances the job fires twice. It has no retry, no timeout, no record of what ran, and if the box reboots at 02:00 the nightly rollup just quietly doesn't happen.
Source: [Dev.to](https://dev.to/paganini2008/turn-a-spring-boot-app-into-a-distributed-cron-cluster-3pd0)