Teknologian jakaminen

SpringBoot päivittäin: @Ajoitettu toteutus suoritetaan kerran, kun palvelu käynnistyy

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Ajastetuista tehtävistä puhuttaessa kannattaa ajatella @Scheduledia, Quartzia ja XXL-JOBia. Jotkut yksittäiset palvelut tai pienet projektit voivat kuitenkin käyttää @Scheduledia suoraan asynkronisten tehtävien toteuttamiseen mukavuuden ja nopeuden vuoksi. Siksi tämän artikkelin teemavaatimuksia on laajennettu.

Kun @Scheduled on käytössä projektissa, kuinka määritetty asynkroninen tehtävä voidaan suorittaa etukäteen, kun projekti käynnistetään?

1. Yksityiskohtainen kuvaus @Scheduled

@Scheduled-merkintä tukee useita parametreja tehtävän suoritusajan joustavaan hallintaan.

  • cron: Cron-lauseke, joka voi ohjata tarkasti sekunteja, minuutteja, tunteja, päiviä, kuukausia, viikkoja jne.
    Lisää kuvan kuvaus tähän
  • vyöhyke: Vastaanota aikavyöhyke, kuten Aasia/Shanghai, yleensä käyttämämme aikavyöhyke. Jätämme tämän kentän yleensä tyhjäksi.
  • fixDelay: Kuinka kauan viimeisen suorituksen päättymisajan jälkeen se suoritetaan uudelleen. Kuten @Scheduled(fixedDelay = 5000)
  • fixDelayString: sillä on sama merkitys kuinfixDelaylla, mutta merkkijonon muodossa. Ainoa ero on, että se tukee paikkamerkkejä, kuten @Scheduled(fixedDelayString = "5000")
  • FixRate: Kuinka kauan viimeisen suoritusajan alkamisen jälkeen, kuten @Scheduled(fixedRate = 5000)
  • fixRateString: Sama merkitys kuinfixRate, mutta merkkijonon muodossa. Ainoa ero on, että paikkamerkkejä tuetaan.
  • InitialDelay: Kuinka kauan viivästää suoritusta ensimmäistä kertaa. Esimerkiksi ensimmäinen viive on 1 sekunti ennen suoritusta. Sen jälkeen se suoritetaan 5 sekunnin välein @Scheduled(initialDelay=1000,fixRate=5000). )
  • initialDelayString: sillä on sama merkitys kuin originDelayStringillä, mutta merkkijonon muodossa. Ainoa ero on, että paikkamerkkejä tuetaan.

2. Looginen toteutus

1. Luo ajoitettu tehtävälogiikkamenetelmä

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class ScheduledTest {

    @Scheduled(cron = "* 1 * * * ?")
    public void task1() throws Exception{
        System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. Luo uusi käynnistyksen suoritusluokka

Tämä luokka kutsuu pääasiassa määritettyä tehtävämenetelmää manuaalisesti käynnistyksen yhteydessä

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class StartupTasks {

    private final ScheduledTest scheduledTasks;

    public StartupTasks(ScheduledTest scheduledTasks) {
        this.scheduledTasks = scheduledTasks;
    }

    @PostConstruct
    public void startUp() {
        try {
            System.out.println("服务启动执行任务");
            scheduledTasks.task1();
        }catch (Exception e){
			e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Huomautus: Muista lisätä @EnableScheduling käynnistysluokkaan, jotta ajoitettu tehtävä suoritetaan. Tämä ei tietenkään vaikuta tämän artikkelin logiikkatestiin.

3. Testitulokset

Kun palvelu on käynnistynyt, katso tulostustiedot
Lisää kuvan kuvaus tähän