Hangfire Cron expressions are not valid - cron

I am using Hangfire and I want to describe different scenarios for my RecurringJobs. But I am not being able to achieve what I am looking for, and if CRON is already limited, the CRON used by Hangfire is yet more.
I went on reading Hangfire documentation and I find a like to https://en.wikipedia.org/wiki/Cron#CRON_expression for more complex expressions then the ones supported by default on Hangfire. But they are not even compatible, for instance, Hangfire only has minutes, hour, month, day, days of the week, but if I use the L or the ? on the day like it says on the documentation it does not work. I have this error the following error for this expression 16 14 L ? ?:
InnerException = {"'L' is not a valid [Day] crontab field value. It must be a numeric value between 1 and 31 (all inclusive)."}
CRON from Hangfire has the following method: Monthly(int day); What happens If I choose for instance 31? It will still run on months like February or April for instance at the last day of each month? Or do I need to do something extra to achieve it?
That way what is happening? I do not seem able to define the condition of the day chosen by the user is 31, to run the background jobs always on the last day of the month. And I don't even talk about days 29 or 30 which are also special causes and which I would use always the last day of the month to process the background job.
I though of using the Month method from Hangfire.CRON but I don't think it will treat the days 29,30 and 31 the way I want.
Do you confirm that Hangfire Cron does not use the Cron expressions that are referenced by documentation and if there is any way to achieve what I am looking for? Also, any suggested tutorial or something to help me out? I have been reading https://github.com/atifaziz/NCrontab which I think it is the one Hangfire uses, but it does not help that much.

You are right about NCrontab. Hangfire uses it, so you should ensure your cron expression is supported by this library. Two simple options to do it:
C# Interactive window (as described in NCrontab Readme, or you could use this example )
Online cron visualizer (like https://crontab.guru or http://cron.schlitt.info)
Cron.Monthly(31) is translated to 0 0 31 * * and job would be triggered only if current month has 31 days.
To run the background job always on the last day of the month, add three separate jobs:
0 0 30 4,6,9,11 *
0 0 31 1,3,5,7,8,10,12 *
0 0 28 2 *
Cron job to run on the last day of the month

Related

Does hangfire support every x years?

I'm using Hangfire 1.7.31, as I can see it only support 6 parts of cron.
However, my requirement is to trigger a job every two years.
Can hangfire be used for this scenario?
You are able to set a cronexpression to fire at a specific date every year.
As per https://crontab.guru/every-year you can use following cron expression:
0 0 1 1 *, whichs translates to:
At 00:00 on day-of-month 1 in January.

Azure function not triggering on specified time

I've been looking around for a solution to an issue I am having. I looked at various posts on the same topic but none of them solved my issue, hence creating a new thread for this, so kindly read it once before marking it as duplicate.
I've created a C# HTTP Timer Trigger Function on Azure and specified CRON timing, but it is behaving weirdly.
This is my function.js
My cron expression: 0 */60 15-3 * * 1,2,3,4,5,6
My function will trigger every 60 minutes between 03:00 PM and 03:00 AM, only on Monday, Tuesday, Wednesday, Thursday, Friday, and Saturday
But to my surprise it is triggering from 3:00 AM to 3:00 PM, and I am unable to understand why.
I followed the accepted answer of Azure function is not triggering on scheduled time post but still it is behaving the same.
Note: I have not enabled internal logging but I am maintaining a separate log in a different folder on Azure.
Edit 1:
I just noticed that, if my function has been scheduled to run within the day i.e. if hour has been set anywhere between 0-24, it works properly but if hour has been set in such a way that it goes over the day i.e. 15-3 (in my case) its behavior changes completely and it runs from 3-15 and not the other way around.
*/60make non sense. Use 0
And following cron logic make two records like:
0 0 0-3 * * 1,2,3,4,5,6
0 0 15-23 * * 1,2,3,4,5,6
If you want to make them as only one record you can try this:
0 0 0-3,15-23 * * 1,2,3,4,5,6
If this do not work you should use record like:
0 0 0,1,2,3,15,16,17,18,19,20,21,22,23 * * 1,2,3,4,5,6

Azure CRON expression for each 15 days

I have a function app which I want to be triggered every alternate Tuesday.
Can anyone suggest the cron expression.
Thanks
Azure Functions uses standard CRON syntax. So using something like this to build them should work:
0 0 0 15 * ? *
(meaning: every 15th day of a month, I hope I got your request right)

Creating Cron Expression with of Days and Months Simultaneously

I simply want to create a cron expression that will execute a job after 'N' number of days. Where N can be any number greater than Zero.
So, It's alright if number is between 1 and 30. For Example Cron Expression to Execute Job after each
25 days at 11 AM will be:
0 0 11 1/25 * ? //'?' can only be specfied for Day-of-Month or Day-of-Week.
but if user exceeds this limit so it means we will have to execute job after 'M' months and 'D' days.
I am unable to understand how I can specify both day and month at the same time. Can anyone make me understand how I can create cron expression for this scenario. You may assume job to be execute after each '65' days
thanks for your time.
The short answer is that cron expressions don't support what you want to do. You'll need to pre-process the user's request and convert it into the appropriate cron expression, or implement your own timing routine, which could use cron behind the scene with some extra logic. Another suggestion is to put some restrictions on the user API that will only allow the user to enter cron friendly times like every month, every week, every 3 months, etc.

cron job between 8am and 8pm 4 times at specified intervals of time

i need to run a job 'x' times a day. job timing is every (say 'y' hours) between 8am and 8pm.
i read the documentation of cron between could not figure out how to place the "between times". any suggestion or a good tutorial should be really helpful.i could figure out this much.
Found this in a tutorial. I believe this will serve the requierment
SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger", "triggerGroup-s1");
simpleTrigger.setStartTime(d);
simpleTrigger.setRepeatInterval(1000*60*60*24);
simpleTrigger.setRepeatCount(15);
simpleTrigger.setEndTime(new Date(ctime + 60000L));
simpleTrigger.setPriority(10);
scheduler.scheduleJob(jobDetail, simpleTrigger);
scheduler.start();
how could i modify the expression to serve my purpose.
You have a * in your example where you need to put the start/end hours:
0 8-20/y * * *
Where you replace y with the number of hours you want between runs should be fine. If you have some strange time like "1 hour and 15 minutes between runs", it's going to be a pain - probably just easier to calculate each time and enter it explicitly.
I don't know you can express this in cron expression.
However, you can use multiple Quartz triggers to serve this purpose.

Resources