I have encountered this Quartz #Schedule annotation in code I have been given to maintain:
#Schedule(second="*/30", minute="*", hour="*", persistent=false)
Regarding the seconds value, does */30 make sense? I assume the intent is to have the job run every 30 seconds, which according to documentation I think should be 0/30. How will the scheduler interpret */30? Could it cause problems?
Regarding the seconds value, does */30 make sense?
*/30 is a valid expression and it means every 30 seconds.
Related
0 48 16 ? * MON-FRI
What is this? All the cron examples I see on the internet is minutes at the start. But this cron job runs Mon-Fri, every week at 16:48 hrs.
The 0 at the start and the ? throws me off here. This code is written in Java using quartz.
You almost answered your own question. This is not an actual cron schedule. This is a Quartz schedule.
Quartz is guilty of using confusing terminology by referring to this as a "Cron Expression" (see http://www.quartz-scheduler.org/api/2.3.0/org/quartz/CronExpression.html). I suppose calling it a CronLikeExpression or an InspiredByCronExpression would have been too wordy.
You'll see from that JavaDoc page that the 0 at the beginning is the value of a seconds field and the ? in the day-of-month field means "any day of the month".
I need to poll after deployment immediately i.e 0 seconds and then for every 45 mins using cron
Should poll as follows:: 00:00, 00:45, 1:30,2:15,3:00 and so on
Why do you have to use cron?
Your best bet in this case is to not use cron, rather use Mule's in-built fixed-frequency scheduler:
Note how the the default delay is "0" which means that it will run immediately upon deployment, then will run every 45 minutes after.
Here is the configuration-xml:
...
<flow name="polling-frequency-example-flow"
processingStrategy="synchronous">
<poll doc:name="poll-every-forty-five-mins">
<fixed-frequency-scheduler frequency="45" timeUnit="MINUTES"/>
</poll>
<!-- Do Something -->
</flow>
...
I don't know how to poll in Mule, but I can help you with your cron schedule.
Cron doesn't support every-45-minutes. You'll have to break it into three cronjobs:
0,45 0-23/3 * * *
30 1-23/3 * * *
15 2-23/3 * * *
CRON expression to poll every 45 minutes, this will solve ur first problem.
0 0/45 * 1/1 * ? *
Running once immediately after the deployment can't be handled with "Poll" as far as I know. As a workaround, in addition to the Poll component above, create another flow with "QUARTZ Inbound Endpoint" and it has a repeatCount attribute which you can set it to "Zero"(this will run exactly once and won't repeat itself).
Cron expression (for every 45 mins): 0 0/45 * 1/1 * ? *
If you want to run every 45 mins(00:15,01:00 like this) use quartz.
if you used poll operation it will not run every 45 mins, it will run every 45 mins when the project or flow deployed.
Simply use the fixed frequency scheduler construct as stated by #Mooz and then get the current time, check if it is a Sunday and do not process if it is. A cron expression is not really directly intended to handle all of the constraints of running immediately, a frequency relative to starting time rather than a clock schedule, and a day scheduling even with Mule's extensions to cron. Other solutions would be to use two controllers, but this would seem cleaner to me.
run every 10 seconds
0/10 * * * * ?
run every 45 minutes
* 0/45 * * * ?
Instead of using the Cron jobs just go with fixed frequency scheduler simply.
set the value as follows:
frequency: 45
start delay as :0
Time unit as:minutes
Am willing to run a script every 45 minute (not the :45th minute of every hour)
e.g. 10:00, 10:45, 11:30, 12:15, and so on.
*/45 * * * *
Am not sure this is the correct expression.
I suspect (edit: I'm pretty sure by now) that it doesn't do what you want: fields are separate, and */45 for minutes is nothing more than 0,45. I would use the following three entries if */45 doesn't do the job:
0,45 0-23/3 * * *
30 1-23/3 * * *
15 2-23/3 * * *
If you take a look at entry.c file in vixie cron sources, you'll notice that each field of each entry is parsed by get_list and represented as bitmaps of allowed values for that field. That almost precludes any "smart" interpretation, as the distinction of */45 and 0,45 is lost at this stage... but there is a MIN_STAR flag, set at the presence of * in minutes (including */45). So we take a look at cron.c, a single place where MIN_STAR is examined, to learn it's unrelated to our problem. Now we know for sure that */45 means "every 45th minute of every hour": 0:00, 0:45, 1:00, 1:45 and so on.
There were two answers here confidently stating the opposite, quoting an unfortunate passage in the manual:
Steps are also permitted after an asterisk, so if you want to say
"every two hours", just use "*/2"
We are lucky to have a 24 hour day, containing even number of hours, making "every two hours from 0:00, each day" and "every two hours generally" indistinguishable. Too bad that the manual didn't go far enough to document non-trivial cases, making the impression that * */22 means every 22 hours. It does not. Star with a step is just a shorthand for a list of values in the field where it's used; it doesn't interact with other fields.
At the basic timing of cron, your system checks once per minute to see if there are any cronjobs to run. It will look at your crontab, and if it is time to run, poof, it runs! But every 45 minutes is an interval that will always hit at a 15 minute mark on the clock face. for example starting from zero the first is 0:45. Next will be 90 minutes from zero, or 1:30, the next will be 2:15... so easily you can see that the time for each instance you want to execute your script the minute hand will be on 12, 3, 6, or 9. If you execute your script every 15 minutes, and check the hour to see if it is the correct one, you can then execute your script. You will probably use either a table, or you might also use the modulo feature. Cheers!
I'm using perl cron, and I want to make a rule like this
run every xx min/hours starting at yy:yy time (until the end of time)
How would I put this into a cron string? perl:cron seems to use the same syntax as regular cron so a regular cron string should work
TIA!
The short answer is that you will either need to write this yourself or find a different third-party package, due to your requirements. There's two things you're asking for that cron doesn't do:
Run every X minutes.
Say you want to run every 40 minutes, and you write this */40 * * * *. This actually runs every 60 minutes at 1:40, 2:40, etc.
Start/Stop at time Y/Z.
There's simply no cron syntax for this. You could use a couple more cronjobs to add/remove the main cronjob at the specified times, but this smells a lot like self-modifying code. Given the complexity (read: unreliability), it's probably better to find a different system.
You can specify intervals with a slash. Here's every 5 minutes:
*/5 * * * *
This is every 2 hours:
0 */2 * * *
You cannot give a start/ end time in cron.
In crontab, I can use an asterisk to mean every value, or "*/2" to mean every even value.
Is there a way to specify every odd value? (Would something like "1+*/2" work?)
Depending on your version of cron, you should be able to do (for hours, say):
1-23/2
Going by the EXTENSIONS section in the crontab(5) manpage:
Ranges can include "steps", so "1-9/2" is the same as "1,3,5,7,9".
For a more portable solution, I suspect you just have to use the simple list:
1,3,5,7,9,11,13,15,17,19,21,23
But it might be easier to wrap your command in a shell script that will immediately exit if it's not called in an odd minute.
Every odd minute would be:
1-59/2 * * * *
Every even minute would be:
0-58/2 * * * *
I realize this is almost 10 years old, but I was having trouble getting 1-23/2 for an every two hour, odd hour job.
For all you users where, exact odd hour precision is not needed. I did the following which suited my teams needs.
59 */2 * * *
Execute the job every two hours, at the 59th Minute.
Try
1-23/2
From your question, I'm assuming Vixie Cron. I doubt this will work with any other cron.
As I read the manual "1-23/2" (for hours) would do the trick.
Works on Cronie
Even with 5 minutes interval e.g.
3-58/5 * * * * /home/test/bin/do_some_thing_every_five_minute