Siirry pääsisältöön

Namespaces

Avaa ChatGPT:ssä
24.22
Java API

Nimit webforJ:ssä tarjoavat mekanismin jaetun datan tallentamiseen ja hakemiseen eri skopeissa web-sovelluksessa. Ne mahdollistavat komponenttien välisen ja istuntojen yli tapahtuvan dataviestinnän ilman perinteisten tallennusmenetelmien, kuten istuntoattribuuttien tai staattisten kenttien, käyttöä. Tämä abstraktio mahdollistaa kehittäjille tilan kapseloinnin ja käyttöoikeuden hallitussa, säikeistön turvallisessa ympäristössä. Nimit ovat ihanteellisia monikäyttäjäyhteistyötyökalujen rakentamiseen tai yksinkertaisesti johdonmukaisien globaalien asetusten ylläpitämiseen, ja ne mahdollistavat datan koordinoimisen turvallisesti ja tehokkaasti.

Mikä on nimiavaruus?

Nimiavaruus on nimetty säiliö, joka tallentaa avain-arvo-pareja. Näihin arvoihin voidaan käyttää pääsyä ja muuttaa niitä eri osissa sovellustasi riippuen siitä, minkä tyyppistä nimiavaruutta käytät. Voit ajatella sitä kuin säikeistön turvallista, hajautettua karttaa, jossa on sisäänrakennettu tapahtumankäsittely ja lukitussysteemit.

Milloin käyttää nimiavaruuksia

Käytä nimiavaruuksia, kun:

  • Tarvitset jakaa arvoja käyttäjäistuntojen tai sovelluksen komponenttien välillä.
  • Haluat reagoida arvojen muutoksiin kuuntelijoiden avulla.
  • Tarvitset hienojakoista lukitusta kriittisille alueille.
  • Sinun on säilytettävä ja haettava tilaa tehokkaasti sovelluksesi sisällä.

Nimiavaruustyypit

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 liittyneiden käyttäjäistuntojen välillä.
RyhmäJaettu kaikilla säikeillä, jotka on luotu samasta vanhempi säikeestä.Tilan koordinointi säikeiden ryhmässä.
GlobaaliSaatavilla kaikilla palvelin säikeillä (JVM-laajuisesti). Muisti säilyy, kunnes avaimet poistetaan erikseen.Sovelluksen laajuinen jaettu tila.
Oletusvalinnan valitseminen - Suosi PrivateNamespace

Kun epäilet, käytä PrivateNamespace:ia. Se tarjoaa turvallista, rajattua jakamista liittyneiden istuntojen kesken vaikuttamatta globaaliin tai palvelinlaajuiseen tilaan. Tämä tekee siitä luotettavan oletuksen useimmille sovelluksille.

Nimiavaruuden luominen ja käyttäminen

Nimiavaruudet luodaan instanssoimalla yksi saatavilla olevista tyypeistä. Jokainen tyyppi määrittää, miten ja missä dataa jaetaan. Alla olevat esimerkit osoittavat, kuinka luoda nimiavaruus ja olla vuorovaikutuksessa sen arvojen kanssa.

Private nimiavaruus

Yksityisen nimiavaruuden nimi koostuu kahdesta osasta:

  • Etuliite: Kehittäjän määrittelemä tunniste, joka pitäisi olla ainutlaatuinen sovelluksellesi tai moduulillesi konfliktien välttämiseksi.
  • Pohjanimi: Spesifinen nimi jaetulle kontekstille tai datalle, jota haluat hallita.

Yhdessä ne muodostavat koko nimiavaruuden nimen käyttäen muotoa:

etuliite + "." + pohjanimi

Esimerkiksi, "myApp.sharedState".

Nimiavaruudet, jotka on luotu samalla etuliitteellä ja pohjanimellä, viittaavat aina samaan taustaintanssiin. Tämä varmistaa johdonmukaisen jaetun käytön kaikilla kutsuilla PrivateNamespace-instansseilla, joissa on samat tunnisteet.

// 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 nimiä PrivateNamespace:ille, noudata seuraavia sääntöjä:

  • Molempien osien on oltava tyhjät.
  • Kummankin on aloitettava kirjaimella.
  • Vain tulostettavat merkit ovat sallittuja.
  • Välilyöntejä ei hyväksytä.

Esimerkkejä:

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

Ryhmä ja Globaali nimiavaruudet

Yksityisen nimiavaruuden lisäksi webforJ tarjoaa kaksi muuta tyyppiä laajemmille jakamiskonteksteille. Nämä ovat hyödyllisiä, kun tila tarvitsee säilyä yhden istunnon tai säikeen ryhmän yli.

  • Globaali Nimiavaruus: Saatavilla kaikilla palvelin säikeillä (JVM-laajuisesti).
  • Ryhmä Nimiavaruus: Jaettu säikeiden kesken, jotka alkavat samasta vanhemmasta.
// Globaali jaettu tila, saatavilla sovelluksen laajuisesti
GlobalNamespace globalNs = new GlobalNamespace();
globalNs.put("globalTheme", "dark");

// Ryhmäkohtainen tila, rajoitettu säikeille, jotka jakavat yhteisen vanhemman
GroupNamespace groupNs = new GroupNamespace();
groupNs.put("localCache", new HashMap<>());

Arvojen käsittely

Nimiavaruudet tarjoavat johdonmukaisen käyttöliittymän jaetun datan hallintaan avain-arvo-pareilla. Tämä sisältää arvojen asettamisen, hakemisen, poistamisen, pääsyn synkronoinnin ja muutosten tarkkailun reaaliajassa.

Arvojen asettaminen ja poistaminen

Käytä put()-metodia tallentaaksesi arvo tietyllä avaimella. Jos avain on tällä hetkellä lukittu, metodi odottaa, kunnes lukitus vapautuu tai aika loppuu.

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

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

Poistaaksesi avain nimiavaruudesta:

ns.remove("username");

Sekä put() että remove() ovat estäviä toimintoja, jos kohdeavain on lukittu. Jos aikaraja loppuu ennen kuin lukitus vapautuu, heitetään NamespaceLockedException.

Turvallisten samanaikaisten päivitysten varalta, kun sinun tarvitsee vain ylittää arvo, käytä atomicPut(). Se lukitsee avaimen, kirjoittaa arvon ja vapauttaa lukituksen yhdellä askeleella:

ns.atomicPut("counter", 42);

Tämä estää kilpailutilanteet ja välttää manuaalisen lukituksen tarpeen yksinkertaisissa päivitystapauksissa.

Arvojen hakeminen

Hakeaksesi arvon, käytä get():

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

Jos avainta ei ole olemassa, tämä heittää NoSuchElementException. Välttääksesi 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 se puuttuu, käytä computeIfAbsent():

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

Tämä on hyödyllistä jaetuissa arvoissa, jotka luodaan kerran ja käytetään uudelleen, kuten istuntotunnuksissa, kokoonpanolohkoissa tai välimuistitiedoissa.

Manuaalinen lukitus

Jos sinun on suoritettava useita toimintoja samalla avaimella tai koordinoitava useiden avaimien välillä, käytä manuaalista lukitusta.

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

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

ns.removeLock("flag");

Käytä tätä mallia, kun jono operaatioita on suoritettava atomisesti lukemisen ja kirjoittamisen välillä. Varmista aina, että lukitus vapautetaan, jotta voit estää muiden säikeiden blokkaamisen.

Muutosten kuuntelu

Nimiavaruudet tukevat tapahtumakuuntelijoita, jotka mahdollistavat reagoimisen arvojen pääsyyn tai muokkaamiseen. Tämä on hyödyllistä esimerkiksi:

  • Arkaluontoisten avaimien pääsyn lokituksessa tai tarkastuksessa
  • Päivitysten laukaisemisessa, kun kokoonpanon arvo muuttuu
  • Jaetun tilan muutosten valvonnassa monikäyttäjäisissä sovelluksissa

Saatavilla olevat kuuntelijametodit

MetodiLaukausLaajuus
onAccessMikä tahansa avain luetaanKoko nimiavaruus
onChangeMikä tahansa avain muutetaanKoko nimiavaruus
onKeyAccess("key")Tietty avain luetaanPer avain
onKeyChange("key")Tietty avain muutetaanPer avain

Jokainen kuuntelija vastaanottaa tapahtumaobjektin, joka sisältää:

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

Esimerkki: Reagoi mihin tahansa avaimen muutokseen

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

Esimerkki: Seuraa pääsyä tiettyyn avaimen

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

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

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

Esimerkki: Pelitilan jakaminen Risti-nolla-peli

webforJ Risti-nolla-demo tarjoaa yksinkertaisen kaksinpeli, jossa vuorot jaetaan käyttäjien kesken. Projekti osoittaa, kuinka Namespace voi olla hyödyllinen tilan koordinoinnissa ilman ulkoisten työkalujen, kuten tietokantojen tai API:en, luottamista.

Tässä esimerkissä jaettu Java-peliobjekti tallennetaan PrivateNamespace:iin, mikä mahdollistaa useiden asiakkaiden vuorovaikutuksen saman pelilogikan kanssa. Nimiavaruus toimii keskitettynä säiliönä pelitilalle, varmistaen, että:

  • Molemmat pelaajat näkevät johdonmukaisia pelilautapäivityksiä
  • Vuorot synkronoidaan
  • Pelilogiikka on jaettu istuntojen välillä

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

Tutustu koodiin: webforj/webforj-tictactoe