הודעות PubSub עם Spring Data Redis

1. סקירה כללית

במאמר השני הזה מהסדרה הבוחנת את Spring Data Redis, נסתכל על תורי הפאב / תת המסרים.

ברדיס, מפרסמים אינם מתוכנתים לשלוח את הודעותיהם למנויים ספציפיים. במקום זאת, הודעות שפורסמו מאופיינות בערוצים, ללא ידיעה לגבי המנויים (אם בכלל).

באופן דומה, מנויים מביעים עניין בנושא אחד או יותר ומקבלים הודעות מעניינות בלבד, ללא ידיעה מה (אם בכלל) מפרסמים שיש.

התנתקות זו של מפרסמים ומנויים יכולה לאפשר הרחבה גדולה יותר וטופולוגיית רשת דינמית יותר.

2. תצורת Redis

נתחיל להוסיף את התצורה הנדרשת עבור תורי ההודעות.

ראשית נגדיר א MessageListenerAdapter שעועית המכילה יישום מותאם אישית של MessageListener ממשק שנקרא RedisMessageSubscriber. שעועית זו משמשת כמנוי במודל העברת הודעות פאב-משנה:

@Bean MessageListenerAdapter messageListener () {להחזיר חדש MessageListenerAdapter (חדש RedisMessageSubscriber ()); }

RedisMessageListenerContainer הוא מחלקה הניתנת על ידי Spring Data Redis המספקת התנהגות אסינכרונית למאזינים להודעות Redis. זה נקרא באופן פנימי, ולפי התיעוד של Spring Data Redis - "מטפל בפרטים ברמה הנמוכה של האזנה, המרה והעברת הודעות."

@Bean RedisMessageListenerContainer redisContainer () {מיכל RedisMessageListenerContainer = חדש RedisMessageListenerContainer (); container.setConnectionFactory (jedisConnectionFactory ()); container.addMessageListener (messageListener (), נושא ()); מיכל החזרה; }

ניצור גם שעועית באמצעות בנוי בהתאמה אישית MessagePublisher ממשק ו RedisMessagePublisher יישום. בדרך זו נוכל להתקין ממשק API כללי לפרסום הודעות ולקבל יישום של Redis redisTemplate ו נוֹשֵׂא כטיעוני קונסטרוקטור:

@Bean MessagePublisher redisPublisher () {להחזיר RedisMessagePublisher חדש (redisTemplate (), נושא ()); }

לבסוף, נקבע נושא אליו המו"ל ישלח הודעות והמנוי יקבל אותן:

@Bean ChannelTopic נושא () {להחזיר ChannelTopic חדש ("messageQueue"); }

3. פרסום הודעות

3.1. הגדרת ה- MessagePublisher מִמְשָׁק

Spring Data Redis אינו מספק א MessagePublisher ממשק שישמש להפצת הודעות. אנו יכולים להגדיר ממשק מותאם אישית אשר ישתמש בו redisTemplate ביישום:

ממשק ציבורי MessagePublisher {void publish (הודעת מחרוזת); }

3.2. RedisMessagePublisher יישום

הצעד הבא שלנו הוא לספק יישום של ה- MessagePublisher ממשק, הוספת פרטי פרסום הודעות ושימוש בפונקציות ב- redisTemplate.

התבנית מכילה מערכת עשירה מאוד של פונקציות למגוון רחב של פעולות - מתוכן convertAndSend מסוגל לשלוח הודעה לתור דרך נושא:

מחלקה ציבורית RedisMessagePublisher מיישם את MessagePublisher {@ אוטומטית פרטית RedisTemplate redisTemplate; @ נושא ChannelTopic פרטי מאושר; public RedisMessagePublisher () {} ציבורי RedisMessagePublisher (RedisTemplate redisTemplate, נושא ChannelTopic) {this.redisTemplate = redisTemplate; this.topic = נושא; } פרסום חלל ציבורי (הודעת מחרוזת) {redisTemplate.convertAndSend (topic.getTopic (), הודעה); }} 

כפי שאתה יכול לראות, יישום המו"ל פשוט. הוא משתמש ב- convertAndSend () שיטת ה- redisTemplate לעצב ולפרסם את ההודעה הנתונה לנושא שהוגדר.

נושא מיישם פרסום וסמנטיקה כמנוי: כאשר הודעה מתפרסמת, היא עוברת לכל המנויים הרשומים להקשיב לנושא זה.

4. הרשמה להודעות

RedisMessageSubscriber מיישם את נתוני Spring Data המוענקים מחדש MessageListener מִמְשָׁק:

@Service בכיתה ציבורית RedisMessageSubscriber מיישם את MessageListener {public static List messageList = new ArrayList (); חלל ציבורי onMessage (הודעת הודעה, תבנית בתים []) {messageList.add (message.toString ()); System.out.println ("ההודעה שהתקבלה:" + message.toString ()); }}

שימו לב שיש פרמטר שני שנקרא תבנית, שלא השתמשנו בדוגמה זו. התיעוד של Spring Data Redis קובע כי פרמטר זה מייצג את, "תבנית התואמת לערוץ (אם צוין)", אך שניתן יהיה ריק.

5. שליחת וקבלת הודעות

עכשיו נרכיב את הכל. בואו ניצור הודעה ואז נפרסם אותה באמצעות ה- RedisMessagePublisher:

הודעת מחרוזת = "הודעה" + UUID.randomUUID (); redisMessagePublisher.publish (הודעה);

כשאנחנו מתקשרים פרסם (הודעה), התוכן נשלח ל- Redis, שם הוא מנותב לנושא תור ההודעות שהוגדר במפרסם שלנו. ואז הוא מופץ למנויים של נושא זה.

אולי כבר שמת לב לזה RedisMessageSubscriber הוא מאזין, אשר רושם את עצמו בתור לאחזור הודעות.

עם הגעת ההודעה, המנוי onMessage () השיטה שהוגדרה מופעלת.

בדוגמה שלנו, אנו יכולים לאמת שקיבלנו הודעות שפורסמו על ידי סימון ה- messageList בשלנו RedisMessageSubscriber:

RedisMessageSubscriber.messageList.get (0). מכיל (הודעה) 

6. מסקנה

במאמר זה בחנו יישום תור של פאב / תת הודעות באמצעות Spring Data Redis.

יישום הדוגמה לעיל ניתן למצוא בפרויקט GitHub.


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