PubSub razmjena poruka s proljetnim podacima Redis

1. Pregled

U ovom drugom članku iz serije koja istražuje Spring Data Redis, pogledati ćemo redove pub / sub poruka.

U Redisu izdavači nisu programirani da šalju svoje poruke određenim pretplatnicima. Umjesto toga, objavljene poruke karakteriziraju kanali, bez znanja o tome koji pretplatnici (ako ih uopće postoje) mogu postojati.

Slično tome, pretplatnici izražavaju interes za jednu ili više tema i primaju samo poruke koje ih zanimaju, bez znanja o tome koji (ako postoje) izdavači postoje.

Ovo razdvajanje izdavača i pretplatnika može omogućiti veću skalabilnost i dinamičniju topologiju mreže.

2. Konfiguracija Redisa

Počnimo dodavati konfiguraciju potrebnu za redove poruka.

Prvo ćemo definirati a MessageListenerAdapter bean koji sadrži prilagođenu implementaciju MessageListener sučelje nazvano RedisMessageSubscriber. Ovaj grah djeluje kao pretplatnik u modelu pub-sub messaging:

@Bean MessageListenerAdapter messageListener () {vratiti novi MessageListenerAdapter (novi RedisMessageSubscriber ()); }

RedisMessageListenerContainer je klasa koju pruža Spring Data Redis koja pruža asinkrono ponašanje za slušatelje poruka Redis. To se naziva interno i, prema dokumentaciji Spring Data Redis - "obrađuje detalje o niskoj razini slušanja, pretvaranja i slanja poruka."

@Bean RedisMessageListenerContainer redisContainer () {RedisMessageListenerContainer container = new RedisMessageListenerContainer (); container.setConnectionFactory (jedisConnectionFactory ()); container.addMessageListener (messageListener (), topic ()); povratni spremnik; }

Također ćemo stvoriti grah koristeći prilagođenu izradu MessagePublisher sučelje i a RedisMessagePublisher provedba. Na ovaj način možemo dobiti generički API za objavljivanje poruka i omogućiti implementaciju Redisa redisTemplate i tema kao argumenti konstruktora:

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

Na kraju ćemo postaviti temu na koju će izdavač slati poruke, a pretplatnik će ih primati:

@Bean ChannelTopic topic () {return new ChannelTopic ("messageQueue"); }

3. Objavljivanje poruka

3.1. Definiranje MessagePublisher Sučelje

Spring Data Redis ne pruža a MessagePublisher sučelje koje će se koristiti za distribuciju poruka. Možemo definirati prilagođeno sučelje koje će se koristiti redisTemplate u provedbi:

javno sučelje MessagePublisher {void objavljivanje (niz poruka); }

3.2. RedisMessagePublisher Provedba

Sljedeći je korak osigurati provedbu MessagePublisher sučelje, dodavanje detalja za objavljivanje poruka i korištenje funkcija u sustavu Windows redisTemplate.

Predložak sadrži vrlo bogat skup funkcija za širok spektar operacija - od toga convertAndSend sposoban je poslati poruku u red kroz temu:

javna klasa RedisMessagePublisher implementira MessagePublisher {@Autowired private RedisTemplate redisTemplate; @Autowired private ChannelTopic tema; javni RedisMessagePublisher () {} javni RedisMessagePublisher (RedisTemplate redisTemplate, tema ChannelTopic) {this.redisTemplate = redisTemplate; this.topic = tema; } javna void objava (niz poruka) {redisTemplate.convertAndSend (topic.getTopic (), poruka); }} 

Kao što vidite, implementacija izdavača je jednostavna. Koristi convertAndSend () metoda redisTemplate za formatiranje i objavljivanje zadane poruke u konfiguriranoj temi.

Tema implementira semantiku objavljivanja i pretplate: kada je poruka objavljena, ona ide svim pretplatnicima koji su registrirani da slušaju tu temu.

4. Pretplata na Poruke

RedisMessageSubscriber provodi Spring Data Redis MessageListener sučelje:

@Service javna klasa RedisMessageSubscriber implementira MessageListener {javni statički popis messageList = new ArrayList (); javna praznina onMessage (poruka poruke, uzorak bajta []) {messageList.add (message.toString ()); System.out.println ("Poruka primljena:" + message.toString ()); }}

Imajte na umu da postoji drugi parametar koji se zove uzorak, koje u ovom primjeru nismo upotrijebili. Dokumentacija Spring Data Redis navodi da ovaj parametar predstavlja „obrazac koji odgovara kanalu (ako je naveden)“, ali da to može biti null.

5. Slanje i primanje poruka

Sad ćemo sve to složiti. Stvorimo poruku, a zatim je objavimo pomoću RedisMessagePublisher:

Niz poruke = "Poruka" + UUID.randomUUID (); redisMessagePublisher.publish (poruka);

Kad nazovemo objaviti (poruka), sadržaj se šalje Redisu, gdje se preusmjerava na temu reda poruka definiranu u našem izdavaču. Zatim se distribuira pretplatnicima te teme.

Možda ste to već primijetili RedisMessageSubscriber je slušatelj koji se registrira u redu za preuzimanje poruka.

Po dolasku poruke, pretplatnika onMessage () metoda definirana aktivirana.

U našem primjeru provjerom da li smo primili poruke koje smo objavili možemo provjeriti oznakom messageList u našem RedisMessageSubscriber:

RedisMessageSubscriber.messageList.get (0) .sadrži (poruka) 

6. Zaključak

U ovom smo članku ispitali implementaciju reda pub / sub poruka koristeći Spring Data Redis.

Provedba gornjeg primjera može se naći u projektu GitHub.


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