Siirry pääsisältöön

Namespaces

Avaa ChatGPT:ssä
24.22
Java API

Namespaces in webforJ tarjoavat mekanismin jaettujen tietojen tallentamiseen ja hakemiseen eri alueilla verkkosovelluksessa. Ne mahdollistavat komponenttien välisen ja istuntojen välisen tietoliikenteen ilman, että luotetaan perinteisiin tallennustekniikoihin, kuten istuntotietoihin tai staattisiin kenttiin. Tämä abstraktio mahdollistaa kehittäjien kapseloida ja käyttää tilaa hallitusti ja säieystävällisesti. Namespacet ovat ihanteellisia monikäyttäjäyhteistyötyökalujen rakentamiseen tai yksinkertaisesti johdonmukaisen globaalin asetuksen ylläpitämiseen, ja ne antavat sinun koordinoida tietoja turvallisesti ja tehokkaasti.

Mikä on namespace?

Namespace on nimetty säilö, joka tallentaa avain-arvo-pareja. Nämä arvot voidaan käyttää ja muokata eri osissa sovellustasi sen mukaan, mitä namespace-tyyppiä käytät. Ajattele sitä säieystävällisenä, jaettuna karttana, jossa on sisäänrakennettu tapahtumankäsittely ja lukitusmekanismeja.

Milloin käyttää namespacet

Käytä namespacet, kun:

  • Sinun tarvitsee jakaa arvoja käyttäjäistuntojen tai sovelluskomponenttien välillä.
  • Halut toimia arvomuutoksille kuuntelijoiden kautta.
  • Tarvitset hienojakoista lukitusta kriittisille osille.
  • Sinun tarvitsee säilyttää ja hakea tilaa tehokkaasti koko sovelluksesi ajan.

Namespacet tyypit

webforJ tarjoaa kolme tyyppiä namespacet:

TyyppiAlueTyypillinen käyttö
YksityinenJaettu niiden asiakkaiden kesken, jotka käyttävät samaa etuliitettä ja nimeä. Muisti vapautetaan automaattisesti, kun viittauksia ei enää ole.Jaettu tila liittyvien käyttäjäistuntojen välillä.
RyhmäJaettu kaikilla säikeillä, jotka ovat syntyneet samasta parent-säikeestä.Tilan koordinointi säie-ryhmässä.
GlobaaliSaatavilla kaikille palvelin säikeille (JVM-laajuisesti). Muisti säilyy, kunnes avaimet poistetaan erikseen.Sovelluksen laajuinen jaettu tila.
Oletusarvon valinta - Suosi PrivateNamespace- käyttöä

Kun olet epävarma, käytä PrivateNamespace:ia. Se tarjoaa turvallista, rajattua jakamista liittyvien istuntojen välillä vaikuttamatta globaaliseen tai palvelinlaajuiseen tilaan. Tämä tekee siitä luotettavan oletuksen useimmissa sovelluksissa.

Namespace luominen ja käyttö

Namespacet luodaan instanssoimalla yksi saatavilla olevista tyypeistä. Jokainen tyyppi määrittää, miten ja missä dataa jaetaan. Esimerkit alla osoittavat, kuinka luoda namespace ja vuorovaikuttaa sen arvojen kanssa.

Yksityinen namespace

Yksityisen namespacen nimi koostuu kahdesta osasta:

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

Yhdessä ne muodostavat täydellisen namespacen nimen muodossa:

etuliite + "." + perusnimi

Esimerkiksi, "myApp.sharedState".

Namespacet, jotka on luotu samalla etuliitteellä ja perusnimellä, viittaavat aina samaan perustavanlaatuiseen instanssiin. Tämä varmistaa johdonmukaisen jaetun pääsyn kaikkiin PrivateNamespace -kutsuihin, joissa käytetään samoja tunnisteita.

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

Voit tarkistaa olemassaolon ennen luomista:

if (PrivateNamespace.isPresent("myApp.sharedState")) {
PrivateNamespace ns = PrivateNamespace.ofExisting("myApp.sharedState");
}
Nimivihjeet

Kun nimität PrivateNamespace:ia, noudata seuraavia sääntöjä:

  • Molempien osien on oltava ei-tyhjää.
  • Kummankin on aloitettava kirjaimella.
  • Vain tulostettavat merkit ovat sallittuja.
  • Tyhjiä merkkejä ei sallita.

Esimerkkejä:

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

Ryhmä ja Globaali namespacet

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

  • Globaali Namespace: Saatavilla kaikille palvelin säikeille (JVM-laajuisesti).
  • Ryhmä Namespace: Jaettu säikeiden kesken, jotka syntyvät samasta parentista.
// Globaali jaettu tila, saatavilla sovelluslaajuisesti
GlobalNamespace globalNs = new GlobalNamespace();
globalNs.put("globalTheme", "dark");

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

Työskentely arvojen kanssa

Namespacet tarjoavat johdonmukaisen rajapinnan jaetun datan hallitsemiseen avain-arvo-pareilla. Tämä sisältää arvojen asettamisen, hakemisen, poistamisen, pääsyn synkronoinnin ja muutosten tarkkailemisen reaaliaikaisesti.

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 aikaraja päättyy.

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

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

Poistaaksesi avaimen namespacesta:

ns.remove("username");

Sekä put() että remove() ovat estäviä toimintoja, jos kohdeavain on lukittu. Jos aikaraja päättyy ennen lukituksen vapauttamista, heitetään NamespaceLockedException.

Turvallisten rinnakkaisten päivitysten yhteydessä, joissa sinun tarvitsee vain korvata arvo, käytä atomicPut(). Se lukitsee avaimen, kirjoittaa arvon ja vapauttaa lukituksen yhdessä vaiheessa:

ns.atomicPut("counter", 42);

Tämä estää kilpajuoksutilanteet ja välttää manuaalisen lukituksen tarpeen yksinkertaisissa päivitysskenaarioissa.

Arvojen hakeminen

Arvon hakemiseen käytä get():

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

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

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

Tarkistaaksesi, onko avain määritelty:

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

Jos haluat alustaa arvon laiskasti 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 istuntotunnukset, konfiguraatiolohkot tai välimuistitiedot.

Manuaalinen lukitus

Jos sinun tarvitsee suorittaa useita toimintoja samalla avaimella tai koordinoida useiden avainten välillä, käytä manuaalista lukitusta.

ns.setLock("flag", 500); // Odota jopa 500ms lukitusta

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

ns.removeLock("flag");

Käytä tätä kaavakuviota, kun toimintoja on suoritettava atomisesti lukemisten ja kirjoitusten kesken. Varmista aina, että lukitus vapautetaan estämään muiden säikeiden estäminen.

Muutoksista kuunteleminen

Namespacet tukevat tapahtumakuuntelijoita, jotka sallivat sinun reagoida arvojen hakemiseen tai muokkaamiseen. Tämä on hyödyllistä skenaarioissa, kuten:

  • Rajoituksen tai käytön kirjaaminen arkaluontoisille avaimille
  • Päivitysten laukaisu, kun konfiguraatioarvo muuttuu
  • Jaetun tilan muutosten seuranta monikäyttäjä sovelluksissa

Saatavilla olevat kuuntelumetodit

MetodiLaukaiseLaajuus
onAccessMikä tahansa avain on luettuKoko namespace
onChangeMikä tahansa avain on muutettuKoko namespace
onKeyAccess("key")Tietty avain on luettuPer avain
onKeyChange("key")Tietty avain on muutettuPer avain

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

  • Avain nimen
  • Vanha arvo
  • Uusi arvo
  • Viittauksen namespaceen

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ää rekisteröidyn kuuntelijan poistamiseen myöhemmin:

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

Esimerkki: Pelitilan jakaminen Tic-Tac-Toe

webforJ Tic-Tac-Toe demo tarjoaa yksinkertaisen kaksinpelin, jossa vuorot jakautuvat käyttäjien kesken. Projekti havainnollistaa, kuinka Namespace voi koordinoida tilaa ilman ulkoisten työkalujen, kuten tietokantojen tai API:iden, turvautumista.

Tässä esimerkissä jaettu Java-peliesine tallennetaan PrivateNamespace:iin, jolloin useat asiakkaat voivat vuorovaikuttaa saman pelilogiikan kanssa. Namespace toimii pelitilan keskitettynä säilönä varmistaen, että:

  • Molemmat pelaajat näkevät johdonmukaiset lautapäivitykset
  • Vuorot ovat synkronoituja
  • Pelilogiikka jaetaan istuntojen välillä

Ulkoisia palveluja (kuten REST tai WebSockets) ei tarvita. Kaikki koordinointi tehdään namespacen kautta, mikä korostaa niiden kykyä hallita jaettua tilaa reaaliajassa vähäisellä infrastruktuurilla.

Tutustu koodiin: webforj/webforj-tictactoe