مشهد
غالبًا ما تكون هناك حاجة إلى مهام محددة في التنمية. بالنسبة لمراكز التسوق ، فإن المهام الموقوتة عديدة بشكل خاص ، مثل انتهاء صلاحية القسيمة الموقوتة ، أو طلب الإغلاق الموقوت ، ودفع WeChat لمدة ساعتين دون دفع الطلبات الإغلاق ، وما إلى ذلك ، وكلها تتطلب مهام محددة الوقت. ومع ذلك ، هناك مشكلة في مهام التوقيت نفسها. بشكل عام ، نستفسر عن قاعدة البيانات من خلال الاقتراع المحدد لتحديد ما إذا كانت هناك مهام يجب تنفيذها. وهذا يعني ، بغض النظر عن ماذا ، نحن بحاجة إلى الاستعلام عن قاعدة البيانات أولاً. بعض المهام لديها متطلبات عالية لدقة الوقت وتحتاج إلى الاستعلام مرة واحدة في الثانية. لا يهم إذا كان النظام صغيرًا. إذا كان النظام نفسه كبيرًا وهناك العديد من البيانات ، فهذا ليس واقعية للغاية ، لذلك هناك حاجة إلى طرق أخرى. بالطبع ، هناك العديد من الطرق لتنفيذها ، مثل قوائم توقيت تنفيذ Redis ، وقوائم تأخير JDK بناءً على قوائم انتظار الأولوية ، وجولات الوقت ، وما إلى ذلك لأننا نستخدم RabbitMQ في مشروعنا ، بناءً على مبدأ التنمية والصيانة السهلة ، نستخدم قائمة انتظار RabbitMQ لتنفيذ مهام التوقيت. إذا كنت لا تعرف ما هو RabbitMQ أو كيف يدمج Springboot RabbitMQ ، فيمكنك التحقق من مقالتي السابقة Boot Boot RabbitMQ
قائمة انتظار RabbitMQ تأخير
لا يوجد في قائمة انتظار RabbitMQ نفسها ، ولا يمكن تنفيذها إلا من خلال خصائص قائمة انتظار RabbitMQ. إذا أراد RabbitMQ تنفيذ قوائم قوائم التأخير ، فأنت بحاجة إلى استخدام مفتاح RabbitMQ Dead-Letter (Exchange) ووقت البقاء على قيد الحياة للرسالة TTL (حان الوقت للعيش)
مفتاح الرسالة الميت
ستدخل الرسالة مفتاح حرف ميت إذا تم استيفاء الشروط التالية. تذكر أن هذا مفتاح بدلاً من قائمة انتظار. يمكن أن يتوافق المفتاح مع العديد من قوائم الانتظار.
مفتاح الحرف الميت هو مفتاح عادي ، ولكن نظرًا لأننا نلقي رسائل منتهية الصلاحية ، فهو يسمى مفتاح الحرف الميت. هذا لا يعني أن مفتاح الحرف الميت هو مفتاح محدد.
رسالة TTL (وقت بقاء الرسالة)
TTL للرسالة هو وقت البقاء على قيد الحياة للرسالة. يمكن لـ RabbitMQ تعيين TTL لقوائم الانتظار والرسائل بشكل منفصل. يعني إعداد قائمة الانتظار أن قائمة الانتظار ليس لها وقت الاحتفاظ بالاحتفاظ بالمستهلكين ، ويمكنك أيضًا إعداد إعدادات منفصلة لكل رسالة فردية. بعد هذا الوقت ، نعتقد أن الأخبار قد ماتت ، وتسمى خطاب الموت. إذا تم تعيين قائمة الانتظار وتم تعيين الرسالة ، فسيتم أخذ رسالة صغيرة. لذلك إذا تم توجيه رسالة إلى قائمة انتظار مختلفة ، فقد يكون وقت وفاة هذه الرسالة مختلفًا (إعدادات قائمة انتظار مختلفة). هنا نتحدث عن TTL لرسالة واحدة ، لأنها مفتاح تنفيذ المهام المتأخرة.
byte [] messageBodyBytes = "Hello ، World!". getBytes () ؛ AMQP.BasicProperties Properties = New AMQP.BasicProperties () ؛ Properties.SetExpiration ("60000") ؛ channel.basicpublish ("my-exchange" ، "queue-key" ، properties ، messageBodyBytes) ؛يمكنك تعيين الوقت عن طريق تعيين حقل انتهاء الصلاحية للرسالة أو خاصية X-Message-TTL ، وكلاهما لهما نفس التأثير. إنه مجرد حقل انتهاء الصلاحية هو معلمة سلسلة ، لذلك تحتاج إلى كتابة سلسلة من النوع Int: عندما يتم إلقاء الرسالة أعلاه في قائمة الانتظار ، تم تمرير 60 ثانية ، إذا لم يتم استهلاكها ، فسوف تموت. لن يستهلك المستهلكون. الأخبار وراء هذه الأخبار ليست "ميتة" ويستهلكها المستهلكون. لن يتم حذف الرسائل الميتة وإصدارها في قائمة الانتظار ، وسيتم حسابها في عدد الرسائل في قائمة الانتظار.
مخطط تدفق العملية
إنشاء مفاتيح وقوائم
قم بإنشاء مفتاح حرف ميت
كما هو موضح في الشكل ، هو إنشاء مفتاح عادي. من أجل التمييز السهل ، اسم المفتاح هو التأخير
قم بإنشاء قائمة انتظار رسالة انتهاء صلاحية تلقائية
الوظيفة الرئيسية لهذه قائمة الانتظار هي جعل الرسائل تنتهي صلاحيتها بانتظام. على سبيل المثال ، إذا كنا بحاجة إلى إغلاق الطلب خلال ساعتين ، نحتاج إلى وضع الرسالة في قائمة الانتظار هذه وتعيين وقت انتهاء صلاحية الرسالة إلى ساعتين
قم بإنشاء قائمة انتظار منتهية الصلاحية تلقائيًا باسم DEVERAL_QUEUE1. بالطبع ، لن تنتهي صلاحية المعلمات في الصورة تلقائيًا ، لأننا لا نضع معلمة X-Message-TTL. إذا كانت الرسائل الموجودة في قائمة الانتظار بأكملها هي نفسها ، فيمكنك تعيينها. للمرونة ، لم يتم تعيينها. تمثل المعلمتان الأخريان اثنين من المعلمتين x-dead-letter-exchange التبديل الذي ستدخل إليه الرسالة بعد انتهاء صلاحية الرسالة. التكوين هنا هو التأخير ، وهذا هو مفتاح الحرف الميت. تتمثل مفتاح الترجيح X-Dead-Idter-Idter في تكوين مفتاح التوجيه لمفتاح الحرف الميت بعد انتهاء صلاحية الرسالة. وينطبق الشيء نفسه على إرسال مفتاح التوجيه للرسالة. وفقًا لهذا المفتاح ، سيتم وضع الرسالة في قائمة انتظار مختلفة.
إنشاء قائمة انتظار معالجة الرسائل
قائمة الانتظار هذه هي قائمة الانتظار التي تعالج الرسائل حقًا ، وسيتم معالجة جميع الرسائل التي تدخل قائمة الانتظار هذه
اسم قائمة انتظار الرسائل هو تأخير _queue2
قائمة انتظار الرسائل ملزمة بالتبديل
أدخل صفحة تفاصيل التبديل وربط قوائم الانتظار (تأخير قائمة الانتظار 1 وتأخير قائمة الانتظار 2) إلى المفتاح.
تم تعيين مفتاح التوجيه لقائمة انتظار رسالة انتهاء الصلاحية التلقائي للتأخير
ربط التأخير قائمة الانتظار 2
يجب تعيين مفتاح قائمة انتظار التأخير 2 لإنشاء معلمة مفتاح قائمة انتظار منتهي الصلاحية تلقائيًا ، بحيث يمكن وضع الرسالة تلقائيًا في قائمة انتظار التأخير.
صفحة الإدارة الملزمة كما هو موضح في الشكل:
بالطبع ، يمكن أيضًا تنفيذ هذا الربط باستخدام التعليمات البرمجية ، فقط للتعبير البديهي ، لذلك يتم استخدام منصة الإدارة المستخدمة في هذه المقالة للعمل
أرسل رسالة
String msg = "Hello Word" ؛ messageProperties MessageProperties = new MessageProperties () ؛ messageProperties.setExpiration ("6000") ؛ messageProperties.setCorrelationId (uuid.randomuuid (). toString (). getBytes ()) ؛ رسالة رسالة = رسالة جديدة (msg.getBytes () ، messageProperties) ؛ rabbittemplate.convertandsend ("تأخير" ، "تأخير" ، رسالة) ؛الرمز الرئيسي هو
messageProperties.setExpiration ("6000") ؛اضبط الرسالة لتنتهي صلاحيتها بعد 6 ثوانٍ
ملاحظة: نظرًا لأن الرسالة يجب انتهاء صلاحيتها تلقائيًا ، يجب ألا تقوم بتعيين الاستماع إلى Delay_queue1 ، ولا يمكن قبول الرسائل الموجودة في قائمة الانتظار هذه. خلاف ذلك ، بمجرد استهلاك الرسالة ، لن يكون هناك انتهاء.
تلقي الرسالة
ما عليك سوى تكوين DEHED_QUEUE2 للاستماع لتلقي الرسائل
Package Wang.Raye.RabbitMq.Demo1 ؛ import org.springframework.amqp.core.acknowledgemode ؛ استيراد org.springframework.amqp.core.binding ؛ استيراد org.springframework.amqp.core.binding ؛ استيراد org.springframework.amqp.core.bindingBuilder ؛ استيراد org.springframework.amqp.core.directexchange ؛ استيراد org.springframework.amqp.core.message ؛ استيراد org.springframework.amqp.core.queue ؛ استيراد org.springframework.amqp.ribbit.connection.cachingConnectionFactory ؛ استيراد org.springframework.amqp.ribbit.connection.connectionFactory ؛ استيراد org.springframework.amqp.ribbit.core.ChannelawAremessageListener ؛ استيراد org.springframework.amqp.ribbit.listener.simplemessageListenerContainer ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.context.annotation.bean ؛ استيراد org.springframework.context.annotation.Configuration ؛ configurationpublic class veryqueue { / ** اسم مفتاح الرسائل* / string final string string string static = "تأخير" ؛ / ** Queue Key1*/ public Static Final String RoutingKey1 = "Delay" ؛ / ** Queue Key2*/ Public Static Final String RoutingKey2 = "DEVERAT_KEY" ؛ / *** معلومات ارتباط التكوين* REGRURN*/ bean public connectionFactory ConnectionFactory () {CachingConnectionFactory ConnectionFactory = New CachingConnectionFactory ("" 120.76.237.8 "، 5672) ؛ ConnectionFactory.SetUserName ("Kberp") ؛ ConnectionFactory.setPassword ("kberp") ؛ ConnectionFactory.setVirtualhost ("/") ؛ ConnectionFactory.setPublisherConfirms (True) ؛ // يجب تعيين ConnectionFactory ؛ } / *** تكوين مفتاح الرسائل* تكوين FanoutExchange للمستهلكين: توزيع الرسائل على جميع قوائم الانتظار المربوطة ، دون مفهوم RoutingKey HeadersExchange: Match DirectExchange عن طريق إضافة قيمة مفتاح السمة: توزيع على Queue المحدد ، وفقًا لـ RoutingKey TopicSchange: Multi-key matching* / bean public definive. } / ** * تكوين قائمة انتظار الرسائل 2 * تكوين * / @Bean Public Queue Queue () {return new Queue ("DEVERATE_QUEUE2" ، true) ؛ // QUOTE PRISISTION}/*** QUEUE PIND 2 مع التبديل* تكوين للمستهلكين* regurn*/ @beanautowired public binding () {return bindingbuilder.bind (queue ()). إلى (defaultexchange ()). } / *** قبول المستمع للرسالة ، سيقبل هذا المستمع الرسالة من قائمة انتظار الرسائل 1* تكوين للمستهلكين* @REGANTURN* / @beanautowired simplemessagelistenercontainer messageContainer2 (connectionfactory) {simplemessagelistenercontainer continer = new simplemessaNerainer () container.setqueues (queue ()) ؛ Container.setExposelistenerChannel (true) ؛ Container.setMaxConcurrentConsumers (1) ؛ Container.setConcurrentConsumers (1) ؛ container.setackNowledGemode (الاعتراف gemod.manual) ؛ // وضع وضع تأكيد وضع تأكيد يدويًا على الحاوية. channel.basicack (message.getMessageProperties (). getDeliveryTag () ، false) ؛ إرجاع حاوية ؛ }}ما عليك سوى التعامل مع المهام التي يجب معالجتها بانتظام أثناء الاستماع إلى الرسائل. نظرًا لأن RabbitMQ يمكنه إرسال الرسائل ، يمكنك إرسال رمز ميزة المهمة ، مثل إغلاق الطلب وإرسال معرف الطلب ، والذي يتجنب الحاجة إلى الاستعلام عن تلك الأوامر التي تحتاج إلى إغلاقها وزيادة العبء على MySQL. بعد كل شيء ، بمجرد أن يكون حجم الطلب كبيرًا ، يعد الاستعلام نفسه أمرًا مكلفًا للغاية.
لخص
إن تنفيذ مهام التوقيت بناءً على RabbitMQ هو تعيين وقت انتهاء الصلاحية للرسالة ، ووضعها في قائمة انتظار لا تتم قراءتها ، بحيث سيتم نقل الرسالة تلقائيًا إلى قائمة انتظار أخرى بعد انتهاء صلاحيتها ، ومراقبة مستمع رسالة قائمة الانتظار هذه للتعامل مع العمليات المحددة لمهام التوقيت.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.