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.