تشغيل حدث خلفية عادي في تطبيق الويب Java

StackOverflow https://stackoverflow.com/questions/48293

  •  09-06-2019
  •  | 
  •  

سؤال

في البودكاست رقم 15، ذكر جيف أنه قام بالتغريد حول كيفية تشغيل حدث عادي في الخلفية كما لو كانت وظيفة عادية - ولسوء الحظ لا يمكنني العثور على ذلك من خلال تويتر.الآن أنا بحاجة إلى القيام بشيء مماثل وسأطرح السؤال على الجماهير.

خطتي الحالية هي عندما يدخل المستخدم الأول (ربما أنا) إلى الموقع، فإنه يبدأ سلسلة محادثات في الخلفية تنتظر حتى الوقت المخصص (كل ساعة على مدار الساعة) ثم يبدأ الحدث بحظر الآخرين (أنا مبرمج Windows عن طريق التجارة لذا أفكر فيما يتعلق بالأحداث وWaitOnMultipleObjects) حتى يكتمل.

كيف فعل جيف ذلك في Asp.Net وهل طريقته قابلة للتطبيق في عالم تطبيقات الويب Java؟

هل كانت مفيدة؟

المحلول

أعتقد أن تطوير حل مخصص لتشغيل المهام في الخلفية لا يستحق دائمًا، لذا أوصي باستخدام جدولة الكوارتز في جافا.

في حالتك (تحتاج إلى تشغيل مهام الخلفية في تطبيق ويب) يمكنك استخدام ServletContextListener المضمن في التوزيع من أجل قم بتهيئة المحرك عند بدء تشغيل حاوية الويب الخاصة بك.

بعد ذلك، لديك عدد من الإمكانيات لبدء (تشغيل) مهام الخلفية (الوظائف)، على سبيل المثال.يمكنك استخدام التقويمات أو التعبيرات المشابهة للكرون.في حالتك على الأرجح يجب أن تستقر معها SimpleTrigger يتيح لك تشغيل المهام على فترات زمنية ثابتة ومنتظمة.

يمكن وصف الوظائف نفسها بسهولة أيضًا في كوارتز، ومع ذلك لم تقدم أي تفاصيل حول ما تحتاج إلى تشغيله، لذلك لا يمكنني تقديم اقتراح في هذا المجال.

نصائح أخرى

كما ذكرنا سابقًا، يعد الكوارتز أحد الحلول القياسية.إذا كنت لا تهتم بتجميع مهام الخلفية أو استمرارها عبر عمليات إعادة التشغيل، فيمكنك استخدام دعم ThreadPool المدمج (في Java 5,6).إذا كنت تستخدم أ خدمة تنفيذية مجدولة يمكنك وضع Runnables في تجمع مؤشرات الترابط في الخلفية الذي ينتظر فترة زمنية محددة قبل التنفيذ.

إذا كنت مهتمًا بالتجميع و/أو الاستمرارية، فيمكنك استخدام قوائم انتظار JMS للتنفيذ غير المتزامن، على الرغم من أنك ستظل بحاجة إلى طريقة ما لتأخير مهام الخلفية (يمكنك استخدام Quartz أو ScheddedExecutorService للقيام بذلك).

كانت آلية جيف هي إنشاء نوع ما من الكائنات المخزنة مؤقتًا والتي سيقوم ASP.Net بإعادة إنشائها تلقائيًا في فترة ما - يبدو أنه حل خاص بـ ASP.Net، لذلك ربما لن يساعدك (أو يساعدني) كثيرًا في عالم Java.

يرى https://stackoverflow.fogbugz.com/default.asp?W13117

أتوود:حسنًا، لقد سألت في البداية على تويتر، لأنني أردت فقط شيئًا خفيف الوزن.أنا حقًا لا أريد أن أحب كتابة خدمة Windows.شعرت أن هذا كان خارج نطاق الكود.بالإضافة إلى أن الكود الذي يقوم بالعمل فعليًا هو في الواقع صفحة ويب، لأنه بالنسبة لي، الوحدة المنطقية للعمل على موقع الويب هي صفحة ويب.لذلك، يبدو الأمر كما لو أننا نتصل مرة أخرى بموقع الويب، إنه تمامًا مثل طلب آخر في موقع الويب، لذلك رأيته كشيء يجب أن يظل مضمنًا، والنهج البسيط الذي توصلنا إليه والذي أوصي به لي على تويتر كان الهدف الأساسي هو إضافة شيء ما إلى ذاكرة التخزين المؤقت للتطبيق مع انتهاء صلاحية ثابتة، ثم لديك اتصال مرة أخرى، لذلك عندما تنتهي صلاحية ذلك، فإنه يستدعي وظيفة معينة تقوم بالعمل ثم تقوم بإضافته مرة أخرى إلى ذاكرة التخزين المؤقت بنفس انتهاء الصلاحية.لذا، ربما تكون كلمة "غيتو" هي الكلمة الصحيحة.

لقد كان نهجي دائمًا هو استخدام نظام التشغيل (أي.Cron أو برنامج جدولة المهام في Windows) بتحميل عنوان URL محدد في فترة ما، ثم قم بإعداد صفحة على عنوان URL هذا للتحقق من قائمة الانتظار الخاصة بها، وتنفيذ أي مهام مطلوبة، ولكن سأكون مهتمًا بمعرفة ما إذا كانت هناك طريقة أفضل.

من النص، يبدو أن FogBugz يستخدم خدمة Windows لتحميل نهج URL أيضًا.

سبولسكي:لذلك لدينا هذه الصفحة الخاصة التي تسمى heartbeat.asp.وتلك الصفحة، عندما تضغط عليها، يمكن لأي شخص أن يصل إليها في أي وقت:لا يضر.ولكن عند تشغيل هذه الصفحة، فإنها تتحقق من قائمة انتظار المهام المنتظرة لمعرفة ما إذا كان هناك أي شيء يلزم القيام به.وإذا كان هناك أي شيء يجب القيام به، فإنه يفعل شيئًا واحدًا ثم يبحث في قائمة الانتظار هذه مرة أخرى وإذا كان هناك أي شيء آخر يجب القيام به فإنه يُرجع علامة زائد، وتكون صفحة الويب بأكملها التي تُرجعها مجرد حرف واحد به علامة زائد فيه.وإذا لم يكن هناك أي شيء آخر يجب القيام به، فإن قائمة الانتظار فارغة الآن، وتقوم بإرجاع علامة ناقص.لذلك، يمكن لأي شخص استدعاء هذا والضغط عليه عدة مرات، ويمكنك تحميل نبضات القلب.asp في متصفح الويب الخاص بك، اضغط على Ctrl-R Ctrl-R Ctrl-R Ctrl-R حتى تبدأ في الحصول على السلبيات بدلاً من الإيجابيات.وعندما تنتهي من ذلك، سيكون FogBugz قد أكمل جميع أعمال الصيانة التي يتعين عليه القيام بها.هذا هو الجزء الأول، والجزء الثاني عبارة عن خدمة Windows بسيطة للغاية يتم تشغيلها، ووظيفتها بأكملها هي الاتصال بـ heartbeat.asp وإذا حصلت على إشارة زائد، فاتصل بها مرة أخرى قريبًا، وإذا حصلت على إشارة سالبة مرة أخرى، ولكن ليس لفترة من الوقت.إذًا، هناك خدمة Windows التي تعمل دائمًا، ولها مهمة بسيطة جدًا جدًا تتمثل في النقر على عنوان URL، والنظر لمعرفة ما إذا كانت تحصل على علامة زائد أو ناقص، ثم جدولة وقت تشغيلها مرة أخرى بناءً على ما إذا كان حصلت على زائد أو ناقص.ومن الواضح أنه يمكنك القيام بأي نوع من الاختلافات التي تريدها في هذا الموضوع ، مثل على سبيل المثال ، هل يمكنك فعليًا ، بدلاً من العودة فقط أو ناقصًا يمكنك أن تقول "حسنًا اتصل بي في 60 ثانية" أو "اتصل بي على اليمين بعيدا لدي المزيد من العمل الذي يتعين القيام به ". وهكذا يعمل ...بحيث يتم تشغيل خدمة الصيانة فقط، كما تعلمون، إنها مثل نصف صفحة من التعليمات البرمجية التي تقوم بتشغيل خدمة الصيانة هذه، ولا يلزم تغييرها أبدًا، ولا تحتوي على أي منطق هناك، إنها فقط يحتوي على الدغدغة التي تتسبب في استدعاء صفحات الويب هذه بتردد معين مضمون.وداخل صفحة الويب هذه على heartbeat.asp يوجد رمز يحتفظ بقائمة انتظار من المهام التي يجب القيام بها وينظر في مقدار الوقت المنقضي، كما تعلم، كما تعلم، يتم إجراء الصيانة في وقت متأخر من الليل وكل سبعة أيام يحذف جميع الرسائل القديمة التي تم تصنيفها على أنها بريد عشوائي وجميع أنواع مهام الصيانة الخلفية فقط.وهذه هي الطريقة التي يتم بها ذلك.

نحن نستخدم jtcron لمهام الخلفية المجدولة لدينا.إنه يعمل بشكل جيد، وإذا فهمت cron، فيجب أن يكون ذلك منطقيًا بالنسبة لك.

إليك كيفية القيام بذلك على StackOverflow.com:

http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top