A Couchbase használata egy tavaszi alkalmazásban

1. Bemutatkozás

A Couchbase bevezetésünknek ebben a folytatásában létrehozunk egy Spring szolgáltatáskészletet, amelyek együttesen felhasználhatók a Spring Data alapfelhasználás nélküli alapvető perzisztencia rétegének létrehozására.

2. Klaszter szolgáltatás

Annak kielégítése érdekében, hogy csak egyetlen CouchbaseEnvironment aktív lehet a JVM-ben, egy szolgáltatás megírásával kezdjük, amely csatlakozik egy Couchbase-fürthöz, és hozzáférést biztosít az adatcsomagokhoz, anélkül, hogy Fürt vagy CouchbaseEnvironment példányok.

2.1. Felület

Itt van a miénk ClusterService felület:

nyilvános felület ClusterService {Bucket openBucket (String neve, String jelszó); }

2.2. Végrehajtás

Végrehajtási osztályunk a DefaultCouchbaseEnvironment és a fürthöz kapcsolódik a @PostConstruct szakasz a tavaszi kontextus inicializálása során.

Ez biztosítja, hogy a fürt ne legyen null, és hogy kapcsolódjon, amikor az osztály más szolgáltatási osztályokba kerül, így lehetővé téve számukra egy vagy több adatcsoport megnyitását:

@Service public class ClusterServiceImpl megvalósítja a ClusterService {private Cluster cluster; @PostConstruct private void init () {CouchbaseEnvironment env = DefaultCouchbaseEnvironment.create (); fürt = CouchbaseCluster.create (env, "localhost"); } ...}

Ezután megadjuk a ConcurrentHashMap a nyitott vödrök visszatartására és a openBucket módszer:

privát Map vödrök = new ConcurrentHashMap (); @Szinkronizált nyilvános vödör felülbírálása openBucket (String neve, String jelszó) {if (! Buckets.containsKey (name)) {Bucket bucket = cluster.openBucket (név, jelszó); vödrök.put (név, vödör); } return buckets.get (név); }

3. Vödörszolgáltatás

Az alkalmazás felépítésétől függően előfordulhat, hogy több Spring szolgáltatásban hozzáférést kell biztosítania ugyanahhoz az adatsávhoz.

Ha csupán ugyanazt a csomagot próbáltuk megnyitni két vagy több szolgáltatásban az alkalmazás indításakor, akkor az ezt megkísérlő második szolgáltatás valószínűleg ConcurrentTimeoutException.

A forgatókönyv elkerülése érdekében meghatározzuk a BucketService interfész és implementációs osztály / csoport. Minden megvalósítási osztály hídként működik a ClusterService és az osztályok, amelyek közvetlen hozzáférést igényelnek egy adott személyhez Vödör.

3.1. Felület

Itt van a miénk BucketService felület:

nyilvános felület BucketService {Bucket getBucket (); }

3.2. Végrehajtás

A következő osztály hozzáférést biztosít a „baeldung-tutorial”Vödör:

@Service @Qualifier ("TutorialBucketService") nyilvános osztály TutorialBucketService megvalósítja a BucketService {@Autowired private ClusterService couchbase-t; saját vödör vödör; @PostConstruct private void init () {bucket = couchbase.openBucket ("baeldung-tutorial", ""); } @Orride public Bucket getBucket () {return bucket; }}

Az injekció beadásával ClusterService miénkben TutorialBucketService implementációs osztály és a csoport megnyitása egy metódussal @PostConstruct, gondoskodtunk arról, hogy a vödör használatra kész legyen, amikor a TutorialBucketService ezt követően más szolgáltatásokba injektálják.

4. Perzisztencia réteg

Most, hogy van szolgáltatásunk a Vödör például létrehozunk egy lerakatszerű perzisztencia réteget, amely CRUD műveleteket biztosít az entitásosztályok számára más szolgáltatások számára anélkül, hogy kitenné a Vödör például nekik.

4.1. A személy entitás

Itt van Személy entitásosztály, amelyet fenn akarunk tartani:

public class Személy {private String id; privát String típus; privát karakterlánc neve; privát String homeTown; // szabványos mérőeszközök és beállítók}

4.2. Entitásosztályok konvertálása JSON-ba és onnan

Az entitásosztályok konvertálása a JsonDocument objektumokat, amelyeket a Couchbase használ a perzisztencia műveleteiben, definiáljuk a JsonDocumentConverter felület:

nyilvános felület JsonDocumentConverter {JsonDocument toDocument (T t); T fromDocument (JsonDocument doc); }

4.3. A JSON Converter megvalósítása

Ezután meg kell valósítanunk a JsonConverter mert Személy entitások.

@Service public class PersonDocumentConverter megvalósítja a JsonDocumentConverter {...}

Használhatnánk a Jackson könyvtár együtt a JsonObject osztályé Jsonnak és Json-tól módszerek agazdálkodó egységek, ennek azonban további általános költségei vannak.

Ehelyett a dokumentálni módszer, akkor a folyékony módszereket fogjuk használni JsonObject osztály létrehozására és feltöltésére a JsonObject mielőtt becsomagolja a JsonDocument:

@Orride public JsonDocument toDocument (Személy p) {JsonObject content = JsonObject.empty () .put ("type", "Person") .put ("name", p.getName ()) .put ("homeTown", p .getHomeTown ()); return JsonDocument.create (p.getId (), tartalom); }

És a fromDocument módszer, akkor aJsonObject osztályé getString módszer a Személy osztály a mi fromDocument módszer:

@Orride public Person fromDocument (JsonDocument doc) {JsonObject content = doc.content (); P személy = új személy (); p.setId (doc.id ()); p.setType ("Személy"); p.setName (content.getString ("név")); p.setHomeTown (content.getString ("homeTown")); visszatérő p; }

4.4. CRUD interfész

Most létrehoztunk egy általános CrudService interfész, amely meghatározza az entitásosztályok perzisztencia műveleteit:

nyilvános felület CrudService {void create (T t); T olvasott (String id); T readFromReplica (String id); érvénytelen frissítés (T t); void delete (karakterlánc azonosító); logikai érték létezik (String id); }

4.5. A CRUD szolgáltatás megvalósítása

Az entitás és átalakító osztályok meglétével most megvalósítjuk a CrudService a Személy entitás, a fent bemutatott tárolószolgáltatás és dokumentum-átalakító injektálása, és az inicializálás közbeni lekérése:

@Service public class PersonCrudService a CrudService {@Autowired private TutorialBucketService bucketService; @Autowired private PersonDocumentConverter átalakító; saját vödör vödör; @PostConstruct private void init () {bucket = bucketService.getBucket (); } @Orride public void create (Személy személy) {if (person.getId () == null) {person.setId (UUID.randomUUID (). ToString ()); } JsonDocument document = átalakító.toDocument (személy); vödör.beillesztés (dokumentum); } @Orride public Person read (String id) {JsonDocument doc = bucket.get (id); return (doc! = null? converter.fromDocument (doc): null); } @Orride public Person readFromReplica (String id) {List docs = bucket.getFromReplica (id, ReplicaMode.FIRST); return (docs.isEmpty ()? null: converter.fromDocument (docs.get (0))); } @Orride public void update (Személy személy) {JsonDocument document = converter.toDocument (person); vödör.upsert (dokumentum); } @Orride public void delete (String id) {bucket.remove (id); } @Orride public boolean létezik (karakterlánc azonosító) {return bucket.exists (id); }}

5. Az összes összerakása

Most, hogy a perzisztencia rétegünk minden része a helyén van, íme egy egyszerű példa egy regisztrációs szolgáltatásra, amely a PersonCrudService a regisztrálók kitartása és visszakeresése:

@Service public class RegistrationService {@Autowired private PersonCrudService crud; public void registerNewPerson (karakterlánc neve, String homeTown) {Személy személy = új Személy (); person.setName (név); person.setHomeTown (homeTown); crud.create (személy); } public Person findRegistrant (String id) {try {return crud.read (id); } catch (CouchbaseException e) {return crud.readFromReplica (id); }}}

6. Következtetés

Megmutattuk, hogy néhány alapvető Spring szolgáltatással meglehetősen triviális a Couchbase beépítése a Spring alkalmazásba, és az alapvető tartóssági réteg megvalósítása a Spring Data használata nélkül.

Az oktatóanyagban bemutatott forráskód a GitHub projektben érhető el.

A Couchbase Java SDK-ról többet megtudhat a hivatalos Couchbase fejlesztői dokumentációs oldalon.