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.