Správy PubSub s jarnými údajmi

1. Prehľad

V tomto druhom článku zo série skúmajúcej Spring Data Redis sa pozrieme na fronty správ pub / sub.

V Redis nie sú vydavatelia naprogramovaní tak, aby odosielali svoje správy konkrétnym predplatiteľom. Publikované správy sa skôr charakterizujú do kanálov bez toho, aby vedeli, čo môžu mať predplatitelia.

Predplatitelia podobne prejavujú záujem o jednu alebo viac tém a dostávajú iba správy, ktoré ich zaujímajú, bez toho, aby vedeli, aké vydavateľstvá (ak existujú).

Toto oddelenie vydavateľov a predplatiteľov môže umožniť väčšiu škálovateľnosť a dynamickejšiu topológiu siete.

2. Znova nakonfigurujte

Začnime pridávať konfiguráciu, ktorá je požadovaná pre fronty správ.

Najskôr definujeme a MessageListenerAdapter fazuľa, ktorá obsahuje vlastnú implementáciu MessageListener volalo rozhranie RedisMessageSubscriber. Táto fazuľa funguje ako predplatiteľ v modeli zasielania správ pub-sub:

@Bean MessageListenerAdapter messageListener () {vrátiť nový MessageListenerAdapter (nový RedisMessageSubscriber ()); }

RedisMessageListenerContainer je trieda poskytovaná Spring Data Redis, ktorá poskytuje asynchrónne správanie pre poslucháčov správ Redis. Toto sa nazýva interne a podľa dokumentácie Spring Data Redis - „spracováva podrobnosti na nízkej úrovni počúvania, konverzie a dispečingu správ.“

@Bean RedisMessageListenerContainer redisContainer () {RedisMessageListenerContainer kontajner = nový RedisMessageListenerContainer (); container.setConnectionFactory (jedisConnectionFactory ()); container.addMessageListener (messageListener (), topic ()); spätný kontajner; }

Fazuľu tiež vytvoríme pomocou na mieru vyrobeného produktu MessagePublisher rozhranie a RedisMessagePublisher implementácia. Týmto spôsobom môžeme mať všeobecné API na publikovanie správ a implementácia Redis bude mať a redisTemplate a téma ako argumenty konštruktora:

@Bean MessagePublisher redisPublisher () {return new RedisMessagePublisher (redisTemplate (), topic ()); }

Na záver nastavíme tému, na ktorú bude vydavateľ posielať správy a predplatiteľ ich bude dostávať:

@Bean ChannelTopic topic () {vrátiť nový ChannelTopic ("messageQueue"); }

3. Publikovanie správ

3.1. Definovanie MessagePublisher Rozhranie

Spring Data Redis neposkytuje a MessagePublisher rozhranie, ktoré sa má použiť na distribúciu správ. Môžeme definovať vlastné rozhranie, ktoré sa bude používať redisTemplate pri implementácii:

verejné rozhranie MessagePublisher {void publish (reťazcová správa); }

3.2. RedisMessagePublisher Implementácia

Naším ďalším krokom je zabezpečiť implementáciu MessagePublisher rozhranie, pridanie podrobností o publikovaní správ a použitie funkcií v redisTemplate.

Šablóna obsahuje veľmi bohatú sadu funkcií pre širokú škálu operácií - z toho mimo convertAndSend je schopný poslať správu do frontu prostredníctvom témy:

verejná trieda RedisMessagePublisher implementuje MessagePublisher {@Autowired private RedisTemplate redisTemplate; @Autowired private ChannelTopic topic; public RedisMessagePublisher () {} public RedisMessagePublisher (RedisTemplate redisTemplate, ChannelTopic topic) {this.redisTemplate = redisTemplate; this.topic = topic; } public void publish (reťazcová správa) {redisTemplate.convertAndSend (topic.getTopic (), správa); }} 

Ako vidíte, implementácia vydavateľa je jednoduchá. Používa convertAndSend () metóda redisTemplate naformátovať a zverejniť danú správu ku konfigurovanej téme.

Téma implementuje sémantiku publikovania a prihlásenia na odber: po zverejnení správy ju dostanú všetci registrovaní predplatitelia, ktorí si ju vypočujú.

4. Prihlásenie na odber správ

RedisMessageSubscriber implementuje poskytnuté jarné údaje MessageListener rozhranie:

@ Verejná trieda @Service RedisMessageSubscriber implementuje MessageListener {verejný statický Zoznam messageList = nový ArrayList (); public void onMessage (správa správy, vzor byte []) {messageList.add (message.toString ()); System.out.println ("Správa prijatá:" + message.toString ()); }}

Upozorňujeme, že existuje druhý parameter, ktorý sa volá vzor, ktoré sme v tomto príklade nepoužili. Dokumentácia Spring Data Redis uvádza, že tento parameter predstavuje „vzor zodpovedajúci kanálu (ak je uvedený)“, ale môže byť nulový.

5. Posielanie a prijímanie správ

Teraz to všetko spojíme. Vytvorme správu a potom ju zverejníme pomocou RedisMessagePublisher:

String message = "Správa" + UUID.randomUUID (); redisMessagePublisher.publish (správa);

Keď voláme zverejniť (správa), obsah sa odošle spoločnosti Redis, kde sa nasmeruje na tému frontu správ definovanú v našom vydavateľovi. Potom sa distribuuje predplatiteľom tejto témy.

Možno ste si to už všimli RedisMessageSubscriber je poslucháč, ktorý sa zaregistruje do frontu na načítanie správ.

Po príchode správy predplatiteľ onMessage () metóda definovaná spustená.

V našom príklade môžeme skontrolovať, či sme dostali správy, ktoré boli zverejnené, zaškrtnutím políčka messageList v našom RedisMessageSubscriber:

RedisMessageSubscriber.messageList.get (0) .contains (správa) 

6. Záver

V tomto článku sme preskúmali implementáciu frontu správ pub / sub pomocou Spring Data Redis.

Implementáciu vyššie uvedeného príkladu možno nájsť v projekte GitHub.