Siirry pääsisältöön

Namespaces

Avaa ChatGPT:ssä
24.22
Java API

Nimiavaruudet webforJ:ssä tarjoavat mekanismin yhteisten tietojen tallentamiseen ja hakemiseen eri alueilla web-sovelluksessa. Ne mahdollistavat komponenttien välistä ja sessioiden välistä tietoliikennettä ilman perinteisiä tallennusmenetelmiä, kuten sessioattribuutteja tai staattisia kenttiä. Tämä abstraktio antaa kehittäjille mahdollisuuden kapseloida ja käyttää tilaa hallitusti ja säikeet turvattuna. Nimivarat ovat täydellisiä monikäyttäjien yhteistyötyökalujen rakentamiseen tai yksinkertaisesti johdonmukaisten globaalien asetusten ylläpitämiseen, ja ne antavat sinun koordinoida tietoja turvallisesti ja tehokkaasti.

Mikä on nimiavaruus?

Nimiavaruus on nimetty säiliö, joka tallentaa avain-arvo-pareja. Näitä arvoja voidaan käyttää ja muokata eri osissa sovellustasi sen mukaan, mitä nimiavaruutta käytät. Ajattele sitä kuin säikeettömän, hajautetun kartan, jossa on sisäänrakennetut tapahtumankäsittely- ja lukitusmekanismit.

Milloin käyttää nimiavaruuksia

Käytä nimiavaruuksia, kun:

  • Tarvitset jakaa arvoja käyttäjäsessioiden tai sovelluksen komponenttien kesken.
  • Haluat reagoida arvomuutoksiin kuuntelijoiden kautta.
  • Tarvitset tarkkoja lukituksia kriittisille alueille.
  • Tarvitset säilyttää ja noutaa tilaa tehokkaasti sovelluksesi läpi.

Nimiavaruuden tyypit

webforJ tarjoaa kolme tyyppiä nimiavaruuksia:

TyyppiLaajuusTyypillinen käyttö
YksityinenJaettu asiakkaiden kesken, jotka käyttävät samaa etuliitettä ja nimeä. Muisti vapautuu automaattisesti, kun viittauksia ei enää ole.Jaettu tila liittyvien käyttäjäsessioiden välillä.
RyhmänJaettu kaikille säikeille, jotka on luotu samasta vanhempisäikeestä.Tilan koordinointi säiekasassa.
GlobaaliSaatavana kaikissa palvelinsäikeissä (JVM-laajuisesti). Muisti säilytetään, kunnes avaimet poistetaan erikseen.Sovelluksen laajuinen jaettu tila.
Oletusarvon valinta - Suosi PrivateNamespace

Kun olet epävarma, käytä PrivateNamespace:a. Se tarjoaa turvallista, rajattua jakamista liittyvien istuntojen kesken vaikuttamatta globaaliin tai palvelinlaajuiseen tilaan. Tämä tekee siitä luotettavan oletusarvon useimmissa sovelluksissa.

Nimiavaruuden luominen ja käyttö

Nimiavaruudet luodaan instanssoimalla jokin saatavilla olevista tyypeistä. Jokainen tyyppi määrittelee, kuinka ja missä tieto jaetaan. Esimerkit alla havainnollistavat, kuinka luoda nimiavaruus ja olla vuorovaikutuksessa sen arvojen kanssa.

Yksityinen nimiavaruus

Yksityisen nimiavaruuden nimi koostuu kahdesta osasta:

  • Etuliite: Kehittäjän määrittelemä tunniste, joka pitäisi olla ainutlaatuisen sovelluksellesi tai moduulillesi, jotta vältetään ristiriidat.
  • Perusnimi: Erityinen nimi jaetulle kontekstilta tai tiedolle, jota haluat hallita.

Yhdessä ne muodostavat täydellisen nimiavaruuden nimen seuraavassa muodossa:

etuliite + "." + perusnimi

Esimerkiksi, "myApp.sharedState".

Nimiavaruudet, jotka on luotu samasta etuliitteestä ja perusnimestä, viittaavat aina samaan taustainstanssiin. Tämä varmistaa johdonmukaisen jaetun pääsyn kaikkiin PrivateNamespace:in kutsuihin, joissa käytetään samoja tunnisteita.

// Luo tai hae yksityinen nimiavaruus
PrivateNamespace ns = new PrivateNamespace("myApp", "sharedState");

Voit tarkistaa olemassaolon ennen luomista:

if (PrivateNamespace.isPresent("myApp.sharedState")) {
PrivateNamespace ns = PrivateNamespace.ofExisting("myApp.sharedState");
}
Nimeämisohjeet

Kun nimeät PrivateNamespace:n, noudata näitä sääntöjä:

  • Molempien osien on oltava ei-tyhjät.
  • Jokaisen on aloitettava kirjaimella.
  • Vain tulostettavat merkit ovat sallittuja.
  • Välilyöntiä ei sallita.

Esimerkkejä:

  • ✓ mycrm.sessionData
  • ✓ acme.analytics
  • X shared.data (liian yleinen, todennäköisesti ristiriidassa)

Ryhmän ja Globaalit nimiavaruudet

Yksityisen nimiavaruuden lisäksi webforJ tarjoaa kaksi muuta tyyppiä laajemmille jakamisalueille. Nämä ovat hyödyllisiä, kun tila tarvitsee pysyä yli yhdestä istunnosta tai säiekasasta.

  • Globaali Nimiavaruus: Saatavana kaikissa palvelinsäikeissä (JVM-laajuisesti).
  • Ryhmän Nimiavaruus: Jaettu säikeiden kesken, jotka ovat peräisin samasta vanhemmasta.
// Globaali jaettu tila, saatavilla sovelluksen laajuudessa
GlobalNamespace globalNs = new GlobalNamespace();
globalNs.put("globalTheme", "dark");

// Ryhmälähtöinen tila, rajoitettu säikeisiin, jotka jakavat yhteisen vanhemman
GroupNamespace groupNs = new GroupNamespace();
groupNs.put("localCache", new HashMap<>());

Työskentely arvojen kanssa

Nimiavaruudet tarjoavat johdonmukaisen käyttöliittymän jaetun tiedon hallitsemiseen avain-arvo-pareina. Tämä sisältää arvojen asettamisen, hakemisen, poistamisen, pääsyn synkronoinnin ja muutosten seuraamisen reaaliajassa.

Arvojen asettaminen ja poistaminen

Käytä put()-metodia tallentaaksesi arvon tietyn avaimen alle. Jos avain on tällä hetkellä lukittu, metodi odottaa, kunnes lukitus vapautuu tai aikakatkaisu umpeutuu.

// Odottaa enintään 20 ms (oletus) arvon asettamista
ns.put("username", "admin");

// Määritä mukautettu aikakatkaisu millisekunteina
ns.put("config", configObject, 100);

Poistaaksesi avaimen nimiavaruudesta:

ns.remove("username");

Sekä put() että remove() ovat estäviä operaatioita, jos kohdeavain on lukittu. Jos aikakatkaisu umpeutuu ennen lukituksen vapautumista, heitetään NamespaceLockedException.

Turvallisia rinnakkaisia päivityksiä varten, joissa sinun tarvitsee vain korvata arvo, käytä atomicPut(). Se lukitsee avaimen, kirjoittaa arvon ja vapauttaa lukituksen yhdellä askelella:

ns.atomicPut("counter", 42);

Tämä estää kilpailuasetelmia ja välttää tarpeen manuaaliseen lukitsemiseen yksinkertaisissa päivitysskenaarioissa.

Arvojen hakeminen

Arvon hakemiseen käytä get():

Object value = ns.get("username");

Jos avainta ei ole olemassa, tämä heittää NoSuchElementException. Poistaaksesi poikkeukset, käytä getOrDefault():

Object value = ns.getOrDefault("username", "guest");

Tarkistaaksesi, onko avain määritelty:

if (ns.contains("username")) {
// avain on olemassa
}

Jos haluat laiskasti alustaa arvon vain, kun sitä ei ole, käytä computeIfAbsent():

Object token = ns.computeIfAbsent("authToken", key -> generateToken());

Tämä on hyödyllistä jaettavissa arvoissa, jotka luodaan kerran ja käytetään uudelleen, kuten istuntotunnisteet, konfiguraatioblokit tai välimuistetut tiedot.

Manuaalinen lukitseminen

Jos sinun täytyy suorittaa useita toimintoja samalla avaimella tai koordinoida useiden avainten välillä, käytä manuaalista lukitsemista.

ns.setLock("flag", 500); // Odota enintään 500 ms lukitusta

// Kriittinen alue alkaa
Object existing = ns.get("flag");
ns.put("flag", "in-progress");
// Kriittinen alue päättyy

ns.removeLock("flag");

Käytä tätä kaavaa, kun useita toimintoja on suoritettava atomisesti lukemisten ja kirjoitusten välillä. Varmista aina, että lukitus vapautuu, jotta vältetään muiden säikeiden estäminen.

Muutosten kuuntelu

Nimiavaruudet tukevat tapahtumakuuntelijoita, jotka antavat sinun reagoida arvojen käsittelyyn tai muokkaamiseen. Tämä on hyödyllistä seuraavissa skenaarioissa:

  • Lokitus tai auditointi pääsyyn herkkiin avaimiin
  • Päivitysten laukaiseminen, kun konfiguraatioarvo muuttuu
  • Jaetun tilan muutosten seuranta monikäyttäjäisissä sovelluksissa

Saatavilla olevat kuuntelijametodit

MetodiLaukaiseeLaajuus
onAccessMikä tahansa avain luetaanKoko nimiavaruus
onChangeMikä tahansa avain muutetaanKoko nimiavaruus
onKeyAccess("key")Tietty avain luetaanAvainkohtaisesti
onKeyChange("key")Tietty avain muutetaanAvainkohtaisesti

Jokainen kuuntelija saa tapahtumaolion, joka sisältää:

  • Avaimen nimen
  • Vanhan arvon
  • Uuden arvon
  • Viittauksen nimiavaruuteen

Esimerkki: Reagointi mihin tahansa avaimen muutokseen

ns.onChange(event -> {
System.out.println("Avainta muutettiin: " + event.getVariableName());
System.out.println("Vanha arvo: " + event.getOldValue());
System.out.println("Uusi arvo: " + event.getNewValue());
});

Esimerkki: Seuraa tietyn avaimen käyttöä

ns.onKeyAccess("sessionToken", event -> {
System.out.println("Tokenia päästiin käsiksi: " + event.getNewValue());
});

Kuuntelijat palauttavat ListenerRegistration -olion, jota voit käyttää kuuntelijan poistamiseen myöhemmin:

ListenerRegistration<NamespaceKeyChangeEvent> reg = ns.onKeyChange("status", event -> {
// logiikka
});
reg.remove();

Esimerkki: Pelitilan jakaminen Tik-Tak-Toessa

webforJ Tic-Tac-Toe -esittely tarjoaa yksinkertaisen kaksinpelaajapelin, jossa vuorot jaetaan käyttäjien kesken. Projekti osoittaa, kuinka Namespace-moduulia voidaan käyttää tilan koordinoimiseen ilman ulkoisten työkalujen, kuten tietokantojen tai API: iden, luomista.

Tässä esimerkissä jaettu Java-peliodotus tallennetaan PrivateNamespace:een, mikä mahdollistaa useiden asiakaspuolten vuorovaikuttaa saman pelilogiikan kanssa. Nimiavaruus toimii pelin tilan keskitettynä säiliönä varmistaen, että:

  • Molemmat pelaajat näkevät johdonmukaisia lautapäivityksiä
  • Vuorot synkronoidaan
  • Pelilogiikka jakautuu sessioiden kesken

Ulkoisia palveluja (kuten REST tai WebSocketit) ei tarvita. Kaikki koordinointi tapahtuu nimiavaruuksien kautta, mikä korostaa niiden kykyä hallita jaettua tilaa reaaliajassa vähäisellä infrastruktuurilla.

Tutustu koodiin: webforj/webforj-tictactoe