Použitie Couchbase v jarnej aplikácii

1. Úvod

V tejto nadväznosti na náš úvod do Couchbase vytvárame sadu služieb Spring, ktoré je možné použiť spoločne na vytvorenie základnej vrstvy perzistencie pre aplikáciu Spring bez použitia Spring Data.

2. Klastrová služba

Aby sa splnilo obmedzenie, že iba jeden CouchbaseEnvironment môže byť aktívny v JVM, začneme písaním služby, ktorá sa pripája k klastru Couchbase a poskytuje prístup k dátovým segmentom bez priameho odhalenia buď Klaster alebo CouchbaseEnvironment inštancie.

2.1. Rozhranie

Tu je náš ClusterService rozhranie:

verejné rozhranie ClusterService {Bucket openBucket (názov reťazca, heslo reťazca); }

2.2. Implementácia

Naša trieda implementácie vytvára inštancie a DefaultCouchbaseEnvironment a pripája sa ku klastru počas @PostConstruct fázy počas jarnej inicializácie kontextu.

To zaisťuje, že klaster nemá hodnotu null a že je pripojený, keď je trieda vložená do iných tried služieb, čo im umožňuje otvoriť jeden alebo viac dátových segmentov:

@Service verejná trieda ClusterServiceImpl implementuje ClusterService {súkromný klastrový klaster; @PostConstruct private void init () {CouchbaseEnvironment env = DefaultCouchbaseEnvironment.create (); cluster = CouchbaseCluster.create (env, "localhost"); } ...}

Ďalej poskytujeme a ConcurrentHashMap aby obsahoval otvorené vedrá a implementoval openBucket metóda:

súkromné ​​segmenty mapy = nový ConcurrentHashMap (); @Override synchronizované verejné Bucket openBucket (názov reťazca, heslo reťazca) {if (! Buckets.containsKey (name)) {Bucket bucket = cluster.openBucket (meno, heslo); buckets.put (meno, vedro); } vratit vedierka.get (meno); }

3. Vedierková služba

V závislosti na tom, ako si zostavujete architektúru svojej aplikácie, možno budete musieť poskytnúť prístup k rovnakému údajovému segmentu vo viacerých službách Spring.

Ak sme sa počas spustenia aplikácie iba pokúsili otvoriť to isté vedro v dvoch alebo viacerých službách, druhá služba, ktorá sa o to pokúsi, sa pravdepodobne stretne s ConcurrentTimeoutException.

Aby sme sa vyhli tomuto scenáru, definujeme a BucketService rozhranie a implementačná trieda na každý segment. Každá implementačná trieda funguje ako most medzi ClusterService a triedy, ktoré potrebujú priamy prístup k určitej položke Vedro.

3.1. Rozhranie

Tu je náš BucketService rozhranie:

verejné rozhranie BucketService {Bucket getBucket (); }

3.2. Implementácia

Nasledujúca trieda poskytuje prístup k „baeldung-tutorial”Vedro:

@Service @Qualifier ("TutorialBucketService") verejná trieda TutorialBucketService implementuje BucketService {@Autowired private ClusterService couchbase; súkromné ​​vedro; @PostConstruct private void init () {bucket = couchbase.openBucket ("baeldung-tutorial", ""); } @Override public Bucket getBucket () {return bucket; }}

Injekciou ClusterService v našom TutorialBucketService implementačná trieda a otvorenie segmentu v metóde s poznámkami @PostConstruct, zaistili sme, že vedro bude pripravené na použitie, keď TutorialBucketService sa potom vstrekuje do iných služieb.

4. Perzistencia vrstva

Teraz, keď máme zavedenú službu na získanie a Vedro inštancie, vytvoríme vrstvu perzistencie podobnú úložisku, ktorá poskytuje operácie CRUD pre triedy entít iným službám bez vystavenia Vedro napríklad pre nich.

4.1. Subjekt osoby

Tu je Osoba trieda entít, v ktorej chceme pretrvávať:

verejná trieda Osoba {private String id; súkromný typ reťazca; súkromné ​​meno reťazca; private String homeTown; // štandardné getre a setre}

4.2. Prevod tried entít do a z JSON

Ak chcete previesť triedy entít do az JsonDocument objekty, ktoré Couchbase používa pri svojich operáciách perzistencie, definujeme JsonDocumentConverter rozhranie:

verejné rozhranie JsonDocumentConverter {JsonDocument toDocument (T t); T fromDocument (JsonDocument doc); }

4.3. Implementuje sa prevodník JSON

Ďalej musíme implementovať a JsonConverter pre Osoba subjekty.

@Service verejná trieda PersonDocumentConverter implementuje JsonDocumentConverter {...}

Mohli by sme použiť Jackson knižnica v spojení s JsonObject triedy toJson a odJsona metódy na serializáciu a deserializáciusubjektov, existuje tu však ďalšia réžia.

Namiesto toho pre doDokumentu metóda, použijeme plynulé metódy JsonObject triedy na vytvorenie a vyplnenie a JsonObject pred zabalením a JsonDocument:

@Override public JsonDocument toDocument (Osoba p) {JsonObject content = JsonObject.empty () .put ("typ", "Osoba") .put ("meno", p.getName ()) .put ("homeTown", p .getHomeTown ()); vrátiť JsonDocument.create (p.getId (), obsah); }

A pre zDokumentu metóda, použijemeJsonObject triedy getString metóda spolu s nastavovačmi v Osoba triedy v našej zDokumentu metóda:

@Override public Person fromDocument (JsonDocument doc) {JsonObject content = doc.content (); Osoba p = nová osoba (); p.setId (doc.id ()); p.setType („Osoba“); p.setName (content.getString ("meno")); p.setHomeTown (content.getString ("homeTown")); návrat p; }

4.4. Rozhranie CRUD

Teraz vytvárame generikum CrudService rozhranie, ktoré definuje operácie perzistencie pre triedy entít:

verejné rozhranie CrudService {void create (T t); T čítanie (ID reťazca); T readFromReplica (reťazec id); aktualizácia neplatnosti (T t); void delete (ID reťazca); boolean existuje (ID reťazca); }

4.5. Implementácia služby CRUD

S zavedenými triedami entít a prevodníkov teraz implementujeme CrudService pre Osoba entita, vloženie služby segmentu a prevodníka dokumentov zobrazené vyššie a načítanie segmentu počas inicializácie:

@ Verejná trieda @Service PersonCrudService implementuje CrudService {@Autowired private TutorialBucketService bucketService; @Autowired private PersonDocumentConverter prevodník; súkromné ​​vedro; @PostConstruct private void init () {bucket = bucketService.getBucket (); } @Override public void create (Osoba osoba) {if (person.getId () == null) {person.setId (UUID.randomUUID (). ToString ()); } Dokument JsonDocument = converter.toDocument (osoba); vedro.vloženie (dokument); } @Override public Osoba prečítaná (ID reťazca) {JsonDocument doc = bucket.get (ID); return (doc! = null? converter.fromDocument (doc): null); } @Override public Person readFromReplica (String id) {List docs = bucket.getFromReplica (id, ReplicaMode.FIRST); return (docs.isEmpty ()? null: converter.fromDocument (docs.get (0))); } @Override public void update (Osoba osoba) {JsonDocument document = converter.toDocument (osoba); bucket.upsert (dokument); } @Override public void delete (ID reťazca) {bucket.remove (id); } @Override public boolean there (String id) {return bucket.exists (id); }}

5. Dáme všetko dohromady

Teraz, keď máme všetky časti našej vrstvy perzistencie zavedené, tu je jednoduchý príklad registračnej služby, ktorá používa PersonCrudService vytrvať a získať registrujúcich:

@Service verejná trieda RegistrationService {@Autowired private PersonCrudService crud; public void registerNewPerson (meno reťazca, reťazec homeTown) {Osoba osoba = nová Osoba (); person.setName (meno); person.setHomeTown (homeTown); crud.create (osoba); } public Person findRegistrant (String id) {try {return crud.read (id); } chytit (CouchbaseException e) {return crud.readFromReplica (id); }}}

6. Záver

Ukázali sme, že s niekoľkými základnými službami Spring je celkom triviálne začleniť Couchbase do aplikácie Spring a implementovať základnú vrstvu perzistencie bez použitia Spring Data.

Zdrojový kód zobrazený v tejto príručke je k dispozícii v projekte GitHub.

Viac informácií o Couchbase Java SDK sa môžete dozvedieť na oficiálnej stránke dokumentácie pre vývojárov Couchbase.


$config[zx-auto] not found$config[zx-overlay] not found