لإعداد جدولة المهام غير المتزامنة ، نحتاج إلى
postgres نفسها وتوسيعها
pg_task . (لقد قدمت روابط لشوكة postgres ، لأنني قمت ببعض التغييرات التي لم يتم حصرها بعد في المستودع الأصلي. يمكنك أيضًا استخدام
الصورة الجاهزة .)
(يوجد خطأ في PL / pgSQL في PostgreSQL الأصلي ، بسبب أن مجدولي لا يعمل بشكل صحيح عندما يحدث استثناء غير معلوم في مهمة مكتوبة في PL / pgSQL. لقد وصفت هذا الخطأ
هنا وقمت بإصلاحه في مفترقي
هنا .)
لتثبيت المجدول ، لن تحتاج إلى إنشاء ملحق في قاعدة البيانات (لكل). بدلاً من ذلك ، فقط أضفه إلى ملف التكوين
shared_preload_libraries = 'pg_task'
بعد إعادة تشغيل PostgreSQL ، سينشئ المجدول جداول المهام في جميع قواعد البيانات نيابة عن مستخدمي قاعدة البيانات وفي المخططات الافتراضية لهؤلاء المستخدمين.
إذا كنت تريد تشغيل المجدول فقط لقواعد بيانات محددة ، يمكنك تحديدها في ملف التكوين
pg_task.database = 'database1,database2'
إذا كنت تريد تشغيل برنامج الجدولة وليس من مستخدمي قاعدة البيانات ، فيمكن أيضًا تعيين ذلك على النحو
pg_task.database = 'database1:user1,database2:user2'
إذا كنت بحاجة إلى إنشاء جداول جدولة ليست في المخطط الافتراضي للمستخدمين ، يمكنك تعيينها على هذا النحو
pg_task_schema.database1 = schema3
إذا كنت بحاجة أيضًا إلى تسمية جدول الجدولة بشكل مختلف ، فيمكنك القيام بذلك مثل هذا
pg_task_table.database1 = table3
بشكل افتراضي ، يتحقق برنامج الجدولة من المهام كل 1000 مللي ثانية ، ولكن يمكن تغيير ذلك على النحو التالي
pg_task_period.database1 = 100 pg_task_period.database2 = 10
لذلك ، ينشئ المجدول (إن لم يكن قد تم إنشاؤه بالفعل) (مخطط ، إذا لزم الأمر ، و) جدول مهام مع مثل هذه الأعمدة
id BIGSERIAL NOT NULL PRIMARY KEY,
في الواقع ، يبدأ المجدول العديد من مهام سير العمل في الخلفية: واحد لتتبع التغييرات في ملف التكوين وبدء / إيقاف ، إذا لزم الأمر ، عمليات الخلفية الأخرى لجدولة. وسير عمل خلفية واحد لكل قاعدة بيانات للتحقق من المهام المجدولة في كل قاعدة بيانات وإطلاق المهام إذا لزم الأمر.
على سبيل المثال ، إذا أردنا إكمال المهمة في أسرع وقت ممكن ، فإننا ننفذ أمر SQL
INSERT INTO task (request) VALUES ('SELECT now()')
يكتب المجدول نتيجة المهمة إلى عمود النتيجة في نموذج نصي. إذا كان هناك العديد من الأعمدة نتيجة لتنفيذ المهمة ، فسيضيفها المجدول إلى الرأس مع أنواع الأعمدة. أيضًا ، نتيجة للمهمة ، قد يكون هناك عدة أسطر ، ستتم إضافتها جميعًا إلى عمود النتائج.
إذا كنا نريد إكمال مهمة ، على سبيل المثال ، بعد 5 دقائق ، فإننا نكتب الوقت المخطط في العمود المقابل
INSERT INTO task (dt, request) VALUES (now() + '5 min':INTERVAL, 'SELECT now()')
وإذا كنا نريد إكمال المهمة في وقت محدد ، فسنكتبها
INSERT INTO task (dt, request) VALUES ('2019-07-01 00:00:00', 'SELECT now()')
إذا احتجنا إلى تنفيذ المهمة كل 5 دقائق ، فسنكتب هكذا
INSERT INTO task (repeat, request) VALUES ('5 min', 'SELECT now()')
إذا كان الأمر كذلك اكتب
INSERT INTO task (repeat, request, drift) VALUES ('5 min', 'SELECT now()', false)
ثم تتكرر المهمة بعد 5 دقائق من الانتهاء من المهمة (وليس بعد الوقت المحدد ، بشكل افتراضي).
في حالة حدوث استثناء أثناء تنفيذ المهمة ، يتم اعتراضها وكتابتها في شكل نص إلى عمود النتيجة ، ويتم تعيين الحالة المقابلة للمهمة.
على سبيل المثال
INSERT INTO task (request) VALUES ('SELECT 1/0')
إذا كان من الضروري عدم تنفيذ أكثر من مهمتين في وقت واحد في قائمة انتظار المهام ، فإننا نقوم بإنشاء مهام بواسطة الأمر
INSERT INTO task (queue, max, request) VALUES ('queue', 2, 'SELECT now()')
افترض أننا في قائمة الانتظار هذه تراكمت علينا الكثير من المهام ويتم تنفيذها في وقت واحد عن طريق 2. إذا قمت بإنشاء مهمة باستخدام الأمر
INSERT INTO task (queue, max, request) VALUES ('queue', 3, 'SELECT now()')
ثم سيتم تنفيذه في أقرب وقت ممكن لجميع المهام الأخرى في قائمة الانتظار ، أي لا يزال شيء مثل الأولوية