PubSub Messaging a Spring Data Redis szolgáltatással

1. Áttekintés

A Spring Data Redist felfedező sorozat második cikkében megnézzük a kocsma / al üzenet üzenetsorait.

A Redisben a kiadók nincsenek beprogramozva arra, hogy üzenetüket meghatározott előfizetőknek küldjék el. Inkább a közzétett üzeneteket csatornákra jellemzik, anélkül, hogy tudnánk, hogy (esetleg vannak) előfizetők.

Hasonlóképpen, az előfizetők érdeklődést mutatnak egy vagy több téma iránt, és csak érdeklődésre számot tartó üzeneteket kapnak, anélkül, hogy tudnák, hogy vannak-e (ha vannak) kiadók.

A kiadók és előfizetők szétválasztása nagyobb méretezhetőséget és dinamikusabb hálózati topológiát tesz lehetővé.

2. Újra konfigurálja

Kezdjük hozzá az üzenetsorokhoz szükséges konfiguráció hozzáadását.

Először meghatározzuk a MessageListenerAdapter bab, amely tartalmazza a MessageListener interfész nevű RedisMessageSubscriber. Ez a bab előfizetőként működik a pub-sub üzenetküldési modellben:

@Bean MessageListenerAdapter messageListener () {return new MessageListenerAdapter (új RedisMessageSubscriber ()); }

RedisMessageListenerContainer a Spring Data Redis által biztosított osztály, amely aszinkron viselkedést biztosít a Redis üzenet hallgatók számára. Ezt belsőleg hívják, és a Spring Data Redis dokumentációja szerint - „kezeli a hallgatás, konvertálás és az üzenetküldés alacsony szintű részleteit”.

@Bean RedisMessageListenerContainer redisContainer () {RedisMessageListenerContainer container = new RedisMessageListenerContainer (); container.setConnectionFactory (jedisConnectionFactory ()); container.addMessageListener (messageListener (), topic ()); visszatérő konténer; }

Hozzon létre egy babot is egy egyedi tervezésű MessagePublisher interfész és a RedisMessagePublisher végrehajtás. Így rendelkezhetünk általános üzenet-közzétételi API-val, és a Redis implementáció a redisTemplate és téma konstruktorként:

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

Végül létrehozunk egy témát, amelyre a kiadó üzeneteket küld, és az előfizető megkapja őket:

@Bean ChannelTopic téma () {return new ChannelTopic ("messageQueue"); }

3. Üzenetek közzététele

3.1. A MessagePublisher Felület

A Spring Data Redis nem nyújt a MessagePublisher az üzenet terjesztéséhez használandó interfész. Meghatározhatunk egy egyedi felületet, amely használni fogja redisTemplate megvalósításban:

nyilvános felület MessagePublisher {void publish (String üzenet); }

3.2. RedisMessagePublisher Végrehajtás

Következő lépésünk az MessagePublisher felület, üzenet közzétételi részletek hozzáadása és a redisTemplate.

A sablon a funkciók széles skáláját tartalmazza a műveletek széles skálájához - amelyek közül convertAndSend képes egy témán keresztül üzenetet küldeni a várólistára:

public class RedisMessagePublisher megvalósítja a MessagePublisher {@Autowired private RedisTemplate redisTemplate; @Autowired privát ChannelTopic téma; public RedisMessagePublisher () {} public RedisMessagePublisher (RedisTemplate redisTemplate, ChannelTopic topic) {this.redisTemplate = redisTemplate; ez.téma = téma; } public void publish (String üzenet) {redisTemplate.convertAndSend (topic.getTopic (), üzenet); }} 

Amint láthatja, a kiadó megvalósítása egyszerű. Használja a convertAndSend () módszere redisTemplate az adott üzenet formázása és közzététele a konfigurált témában.

Egy téma végrehajtja a szemantika közzétételét és feliratkozását: amikor üzenetet közzétesznek, az az összes regisztrált előfizetőhöz kerül, hogy meghallgassa az adott témát.

4. Feliratkozás az üzenetekre

RedisMessageSubscriber végrehajtja a Spring Data Redis által biztosított MessageListener felület:

@Service public class RedisMessageSubscriber megvalósítja a MessageListener {public static List messageList = új ArrayList (); public void onMessage (Üzenet, byte [] minta) {messageList.add (message.toString ()); System.out.println ("Üzenet beérkezett:" + üzenet.toString ()); }}

Ne feledje, hogy van egy második paraméter is minta, amelyet ebben a példában nem használtunk. A Spring Data Redis dokumentáció kimondja, hogy ez a paraméter a „csatornának megfelelő minta (ha meg van adva)”, de megadható nulla.

5. Üzenetek küldése és fogadása

Most összeállítjuk az egészet. Hozzunk létre egy üzenetet, majd tegyük közzé a RedisMessagePublisher:

String message = "Üzenet" + UUID.randomUUID (); redisMessagePublisher.publish (üzenet);

Amikor hívunk közzététel (üzenet), a tartalmat elküldjük a Redisnek, ahol a kiadónkban meghatározott üzenetsor-témához továbbítjuk. Ezután elosztják a téma előfizetőinek.

Lehet, hogy ezt már észrevette RedisMessageSubscriber egy figyelő, amely regisztrálja magát az üzenetek visszakeresésének sorába.

Az üzenet megérkezésekor az előfizető onMessage () a módszer meghatározása kiváltott.

Példánkban ellenőrizhetjük, hogy közzétett üzeneteket kaptunk-e messageList miénkben RedisMessageSubscriber:

RedisMessageSubscriber.messageList.get (0) .contains (üzenet) 

6. Következtetés

Ebben a cikkben egy pub / sub üzenet várólista megvalósítását vizsgáltuk a Spring Data Redis segítségével.

A fenti példa megvalósítása megtalálható egy GitHub projektben.