Siirry pääsisältöön

Elinkaari kuuntelijat 25.02

Avaa ChatGPT:ssä

AppLifecycleListener-rajapinta mahdollistaa ulkoisen koodin havainnoida ja reagoida sovelluksen elinkaaritapahtumiin. Tämän rajapinnan toteuttamalla voit suorittaa koodia tietyissä vaiheissa sovelluksen käynnistämisen ja sulkemisen aikana ilman, että sinun tarvitsee muokata App-luokkaa itse.

Elinkaari kuuntelijat havaitaan ja ladataan automaattisesti ajonaikana palveluntarjoajan konfiguraatiotiedostojen avulla. Jokainen sovellusesimerkki saa oman joukon kuuntelijaesimerkkejä, mikä pitää eristyksen erilaisten sovellusten välillä, jotka toimivat samassa ympäristössä.

Milloin käyttää elinkaari kuuntelijoita

Käytä elinkaari kuuntelijoita, kun sinun tarvitsee:

  • Alustaa resursseja tai palveluja ennen sovelluksen käynnistymistä
  • Siivota resursseja, kun sovellus päättyy
  • Lisätä poikkileikkaavia huolenaiheita ilman, että muokkaat App-luokkaa
  • Rakentaa liitännäisarkkitehtuureja

AppLifecycleListener-rajapinta

AppLifecycleListener.java
public interface AppLifecycleListener {
default void onWillCreate(Environment env) {} // Seitsemästä 25.03
default void onDidCreate(App app) {} // Seitsemästä 25.03
default void onWillRun(App app) {}
default void onDidRun(App app) {}
default void onWillTerminate(App app) {}
default void onDidTerminate(App app) {}
}
Sovelluksen eristys

Jokainen sovellusesimerkki saa oman joukon kuuntelijaesimerkkejä:

  • Kuuntelijat ovat eristyksissä eri sovellusten kesken
  • Kuuntelijassa olevia staattisia kenttiä ei jaeta sovellusten välillä
  • Kuuntelijaesimerkit luodaan, kun sovellus käynnistyy, ja tuhotaan, kun se päättyy

Jos sinun tarvitsee jakaa tietoja sovellusten välillä, käytä ulkoisia tallennusmekanismeja, kuten tietokantoja tai jaettuja palveluja.

Elinkaari tapahtumat

TapahtumaMilloin kutsutaanYleiset käyttötarkoitukset
onWillCreate 25.03Ympäristön alustamisen jälkeen, ennen sovelluksen luomistaMuokata konfiguraatiota, yhdistää ulkoisia konfiguraatiolähteitä
onDidCreate 25.03Sovelluksen instanssin luomisen jälkeen, ennen alustustaVarhainen sovellustason asettaminen, rekisteröi palveluja
onWillRunEnnen app.run() suoritustaAlustaa resursseja, konfiguroi palveluja
onDidRunSen jälkeen, kun app.run() on onnistuneesti suoritettuAloittaa taustatehtäviä, kirjaa onnistunut käynnistys
onWillTerminateEnnen sovelluksen päättymistäTallenna tila, valmistele sulkemista
onDidTerminateSen jälkeen, kun sovellus on päättynytSiivoa resursseja, lopullinen lokitus

Elinkaari kuuntelijan luominen

Perus toteutus

StartupListener.java
import com.webforj.App;
import com.webforj.AppLifecycleListener;
import com.webforj.Environment;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;

public class StartupListener implements AppLifecycleListener {

@Override
public void onWillCreate(Environment env) {
// Muokkaa konfiguraatiota ennen sovelluksen luomista
Config additionalConfig = ConfigFactory.parseString(
"myapp.feature.enabled = true"
);
env.setConfig(additionalConfig);
}

@Override
public void onDidCreate(App app) {
System.out.println("Sovellus luotu: " + app.getId());
}

@Override
public void onWillRun(App app) {
System.out.println("Sovellus käynnistyy: " + app.getId());
}

@Override
public void onDidRun(App app) {
System.out.println("Sovellus käynnistyi: " + app.getId());
}
}

Kuuntelijan rekisteröinti

Luo palveluntarjoajan konfiguraatiotiedosto:

Tiedosto: src/main/resources/META-INF/services/com.webforj.AppLifecycleListener

com.example.listeners.StartupListener
Käyttämällä AutoServicea

On helppo unohtaa päivittää palvelun kuvastot. Käytä Googlen AutoService automaattisesti luomaan palvelutiedosto:

StartupListener.java
import com.google.auto.service.AutoService;

@AutoService(AppLifecycleListener.class)
public class StartupListener implements AppLifecycleListener {
// Toteutus
}

Suoritusjärjestyksen hallinta

Kun useita kuuntelijoita on rekisteröity, voit hallita niiden suoritusjärjestystä käyttämällä @AppListenerPriority-annotaatiota. Tämä on erityisen tärkeää, kun kuuntelijoilla on riippuvuuksia toisiinsa tai kun tietty alustaminen on tapahtuttava ennen muita.

Prioriteettiarvot toimivat nousevassa järjestyksessä - matalammat numerot suoritetaan ensin. Oletusprioriteetti on 10, joten kuuntelijat ilman eksplisiittisiä prioriteettiannotaatioita suoritetaan niiden jälkeen, joilla on matalammat prioriteettiarvot.

SecurityListener.java
@AutoService(AppLifecycleListener.class)
@AppListenerPriority(1) // Suoritetaan ensin - kriittinen turvallisuusasetaminen
public class SecurityListener implements AppLifecycleListener {
@Override
public void onWillRun(App app) {
initializeSecurity();
}
}

@AutoService(AppLifecycleListener.class)
@AppListenerPriority(10) // Oletusprioriteetti - yleinen lokitus
public class LoggingListener implements AppLifecycleListener {
@Override
public void onWillRun(App app) {
initializeLogging();
}
}

Suoritusvirta sovelluksen koukuilla

Yhdessä hallitsemalla useiden kuuntelijoiden järjestystä on tärkeää ymmärtää, miten kuuntelijat vuorovaikuttavat App-luokan omien elinkaarikoukkuiden kanssa. Jokaisen elinkaaritapahtuman osalta kehys seuraa tiettyä suoritusjärjestystä, joka määrittää, milloin kuuntelijat suoritetaan suhteessa sovelluksen sisäisiin koukkuihin.

Alla oleva kaavio havainnollistaa tätä suoritusvirtaa, jossa näytetään tarkka ajoitus, jolloin AppLifecycleListener-menetelmiä kutsutaan suhteessa vastaaviin App-koukkuihin:

AppLifecycleListener kuuntelijat VS App koukut

Virheiden käsittely

Kuuntelijoiden heittämät poikkeukset tallennetaan lokiin, mutta eivät estä muiden kuuntelijoiden suorittamista tai sovelluksen käynnistämistä. Käsittele aina poikkeuksia kuuntelijoissasi:

Virheiden käsittelyn esimerkki
@Override
public void onWillRun(App app) {
try {
riskyInitialization();
} catch (Exception e) {
logger.error("Alustus epäonnistui", e);
}
}