
نحن نعرّف جداول cron. وندعمها.
cron-utils هي مكتبة جافا لتعريف جداول cron وتحليلها والتحقق من صحتها وترحيلها، بالإضافة إلى الحصول على أوصاف بشرية قابلة للقراءة لها. يتبع المشروع اتفاقية الإصدارات الدلالية، ويوفّر بيانات تعريفية لـ OSGi ويستخدم ترخيص Apache 2.0.
التحميل
cron-utils متوفرة في مستودع Maven central.
<dependency>
<groupId>com.cronutils</groupId>
<artifactId>cron-utils</artifactId>
<version>9.2.1</version>
</dependency>
بالنسبة لمطوّري Android، تفترض cron-utils 7.0.0 استخدام Android 26+؛ أما بالنسبة لإصدارات Android الأقدم، ففكّر في استخدام cron-utils 6.0.6. إذا كنت تستخدم ScheduleExpression من Java EE، فيجب توفيره كاعتماديّة وقت تشغيل.
التطوير الحالي
نعمل حاليًا على تحديث قاعدة الشيفرة البرمجية نحو JDK 16، لضمان التوافق الكامل مع JDK 17 عند إصداره.
نعمل الآن على تطوير جيل جديد من واصفات cron باستخدام الترجمة العصبية! أي نوع من المساهمات مرحّب به: بدءًا من المساعدة في توليد مجموعات البيانات وصولًا إلى تدريب نماذج تعلّم الآلة والأدوات المساعدة لتحميلها! إذا كنت مهتمًا، فيرجى متابعة القضية #3
الميزات
أمثلة الاستخدام
فيما يلي نعرض بعض الأمثلة. يمكنك العثور على هذا وغيره في مستودع أمثلة أنشأناه لعرض مكتبات cron-utils!
إنشاء تعريفات cron
// Define your own cron: arbitrary fields are allowed and last field can be optional
CronDefinition cronDefinition =
CronDefinitionBuilder.defineCron()
.withSeconds().and()
.withMinutes().and()
.withHours().and()
.withDayOfMonth()
.supportsHash().supportsL().supportsW().and()
.withMonth().and()
.withDayOfWeek()
.withIntMapping(7, 0) //we support non-standard non-zero-based numbers!
.supportsHash().supportsL().supportsW().and()
.withYear().optional().and()
.instance();
// or get a predefined instance
cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ);
إنشاء تعبير cron
// Create a cron expression. CronMigrator will ensure you remain cron provider agnostic
import static com.cronutils.model.field.expression.FieldExpressionFactory.*;
Cron cron = CronBuilder.cron(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ))
.withYear(always())
.withDoM(between(SpecialChar.L, 3))
.withMonth(always())
.withDoW(questionMark())
.withHour(always())
.withMinute(always())
.withSecond(on(0))
.instance();
// Obtain the string expression
String cronAsString = cron.asString(); // 0 * * L-3 * ? *
التحليل
// Create a parser based on provided definition
CronParser parser = new CronParser(cronDefinition);
Cron quartzCron = parser.parse("0 23 * ? * 1-5 *");
... حتى تعبيرات cron المتعددة! ماذا عن دمج عدة جداول cron في سطر واحد؟ بدلاً من كتابة 0 0 9 * * ? * و0 0 10 * * ? * و0 30 11 * * ? * و0 0 12 * * ? * يمكننا تضمينها في 0 0|0|30|0 9|10|11|12 * * ? *
الوصف
// Create a descriptor for a specific Locale
CronDescriptor descriptor = CronDescriptor.instance(Locale.UK);
// Parse some expression and ask descriptor for description
String description = descriptor.describe(parser.parse("*/45 * * * * ?"));
// Description will be: "every 45 seconds"
description = descriptor.describe(quartzCron);
// Description will be: "every hour at minute 23 every day between Monday and Friday"
// which is the same description we get for the cron below:
descriptor.describe(parser.parse("0 23 * ? * MON-FRI *"));
الترحيل
// Migration between cron libraries has never been so easy!
// Turn cron expressions into another format by using CronMapper:
CronMapper cronMapper = CronMapper.fromQuartzToCron4j();
Cron cron4jCron = cronMapper.map(quartzCron);
// and to get a String representation of it, we can use
cron4jCron.asString();//will return: 23 * * * 1-5
التحقق من الصحة
cron4jCron.validate()
حساب الوقت من/إلى التنفيذ
// Get date for last execution
ZonedDateTime now = ZonedDateTime.now();
ExecutionTime executionTime = ExecutionTime.forCron(parser.parse("* * * * * ? *"));
ZonedDateTime lastExecution = executionTime.lastExecution(now);
// Get date for next execution
ZonedDateTime nextExecution = executionTime.nextExecution(now);
// Time from last execution
Duration timeFromLastExecution = executionTime.timeFromLastExecution(now);
// Time to next execution
Duration timeToNextExecution = executionTime.timeToNextExecution(now);
تعيين الثوابت بين المكتبات
// Map day of week value from Quartz to JodaTime
int jodatimeDayOfWeek =
ConstantsMapper.weekDayMapping(
ConstantsMapper.QUARTZ_WEEK_DAY,
ConstantsMapper.JODATIME_WEEK_DAY
);
تنسيق التاريخ والوقت للبشر!
استخدم htime - تنسيق التاريخ والوقت القابل للقراءة البشرية لجافا! على الرغم من أن هذه الوظيفة غير مضمّنة في نفس ملف الجرة، إلا أنها مشروع من مشاريع cron-utils قد تجده مفيدًا.
// You no longer need to remember "YYYY-MM-dd KK a" patterns.
DateTimeFormatter formatter =
HDateTimeFormatBuilder
.getInstance()
.forJodaTime()
.getFormatter(Locale.US)
.forPattern("June 9, 2011");
String formattedDateTime = formatter.print(lastExecution);
// formattedDateTime will be lastExecution in "dayOfWeek, Month day, Year" format
cron-utils CLI
نوفّر واجهة CLI بسيطة لاستخدام cron-utils مباشرة من وحدة التحكم، دون كتابة مشروع جديد! إنّ CLI مشروع تابع، متاح على cron-utils-cli
الاستخدام: java -jar cron-utils.jar com.cronutils.cli.CronUtilsCLI --validate -f [CRON4J|QUARTZ|UNIX] -e '<cron expression>'
مثال: java -jar cron-utils.jar com.cronutils.cli.CronUtilsCLI --validate -f UNIX -e '* 1 * * *'
إذا كنت تريد ملف jar مستقلاً دون الحاجة إلى 'cp'، فأنشئ ملف jar موحّد (uber jar) باستخدام:
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
ثم شغّل cli-utils (المبني في مجلد target) باستخدام:
java -jar cron-utils-<version>-jar-with-dependencies.jar com.cronutils.cli.CronUtilsCLI --validate -f [CRON4J|QUARTZ|UNIX] -e '<cron expression>'`
ساهم وادعم!
المساهمات مرحّب بها! يمكنك المساهمة عن طريق
تفقّد صفحتنا! للحصول على إحصائيات حول المشروع، يمكنك زيارة ملفنا الشخصي على OpenHUB.
مشاريع cron-utils الأخرى
يسعدنا أن تزور وتستخدم مشاريع cron-utils التالية: