How is this Quartz Cron Expression executed - cron

I have a the following;
private String cronExpression = "";
private final String jobID = "MyJObID";
...
Scheduler scheduler = ServiceLocator.getInstance().getScheduler();
CronTrigger trigger = new CronTrigger(jobID , Scheduler.DEFAULT_GROUP, cronExpression);
JobDetail jobDetail = new JobDetail(jobID , Scheduler.DEFAULT_GROUP, MyJob.class);
scheduler.scheduleJob(jobDetail, trigger);
My question is when is this job triggered for the empty cron expression?

Are you sure it works?
Just by looking at the org.quartz.CronExpression#buildExpression() method code it looks like an exception should be thrown:
if (exprOn <= DAY_OF_WEEK) {
throw new ParseException("Unexpected end of expression.",
expression.length());
}
// exprOn should be equal to SECOND in case of empty String given
[checked in Quartz 1.6.0]

Thanks for the help guys, found the issue.
After some night of searching i found out that the class was registered in JBoss as a MBean and a value for the cron expression attribute was set to some meaningful value in the deployment descriptor
Sigh

Related

Schedule Repeatable Jobs using bull.js By providing time in repeat rules

I'm currently using bull js to create an api that schedules a job according to inputted time. currently I'm able to do this using crone expression if the time input is in the format of 'YYYY-MM-DD HH:mm". The only problem is that if I want to schedule a job that will run daily I have to write some logic to get time from the inputed time. My question is whether I can specify the repeat rules using a date input as it is done in node-schedule. in short, am looking for the equivalent of the following node-schedule implementation in bull.
var date = new Date(2012, 11, 21, 5, 30, 0);
var j = schedule.scheduleJob(date, function(y){
console.log(y);
}.bind(null,x));```
Based on the documentation, repeating tasks/jobs are handled using cron syntax:
paymentsQueue.process(function(job) {
// Check payments
});
// Repeat payment job once every day at 3:15 (am)
paymentsQueue.add(paymentsData, { repeat: { cron: "15 3 * * *" } });
Use this cron expression validator to verify your logic is correct.

Hangfire Cron Expression failing

I have a task scheduled like this:
RecurringJob.AddOrUpdate("Process inbound external messages", () => ProcessInboundExternalMessages(), Cron.Minutely);
It works.
But I need one to fire ever midnight.
So I tried to create a cron expression:
private const string CronDailyAtMidnight = "0 0 * * *";
And then assign that to my task.
RecurringJob.AddOrUpdate("Deactivate user role allocation on expiry", () => DeactivateUserRoleAllocationOnExpiry(), CronDailyAtMidnight);
However, it never fires. Can anyone see an issue?
The issue was - it uses UTC date. Fixed.

Create predicate on Date field for Hazelcast

Does anyone know how to create the date type predicate for Hazelcast?
I use Predicates.equal("date","value"); It doesn't work properly. I pass an existing date value in Hazelcast. It returns nothing. java.util.date should be comparable.
I don't know why it doesn't compare properly. Anybody can help, appreciate very much!
you can also try out your own predicate. i.e. if you have a map with key being Object and value being Date then you can do the following:
final Date requiredDate = /*your date object*/;
map.values(new Predicate<Object, Date>() {
public boolean apply(Entry<Object, Date> arg0) {
Date date = arg0.getValue();
if(requiredDate.equals(date))
return true;
else
return false;
}
});
you can do other forms of comparisons inside the apply method as well.

How to get the revision from SVN repository between two dates using Groovy Script?

I am using Groovy script.
I am trying to write a Groovy script for getting the revisions between two dates
as we are getting the revision on SVN log. I am new to Groovy I tried many ways but failed to success.
Can any one please help me to get this task done.
Try this code:
DAVRepositoryFactory.setup();
String url = "(directory in svn url)";
String name = "(login name)";
String password = "(login password)";
SVNRepository repository = null;
repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url));
ISVNAuthenticationManager authManager =
SVNWCUtil.createDefaultAuthenticationManager(name, password);
repository.setAuthenticationManager(authManager);
SVNDirEntry entry = repository.info(".", -1);
System.out.println("Latest Rev: " + entry.getRevision());
You will need to use the svnkit downloaded from here: http://svnkit.com/
Maybe this could help you better: http://svnkit.com/kb/javadoc/org/tmatesoft/svn/core/io/SVNRepository.html#getDatedRevision(java.util.Date)
notice to function:
public abstract long getDatedRevision(Date date) SVNException

What to check in my quartz.net job dispatcher for timezone funkyness

Using Quartz.net Server version 2.1.2 which I upgraded to from version 2.0 because of a lack of support for UTC timezone offsets. Jobs are not being sent at the time we specify, and it is seemingly because of timezone offsets.
I have three job types:
Job Frequency Requirments
Daily (once a day at a given time)
Weekly (on one to N days, once each day at a given time)
Monthly (on one to n days, once a day, or at the last day)
For all three I use Cron expressions with SimpleTriggers.
My question is:
what are the things I need to tick off to verify that the jobs I am scheduling, and the jobs that are going to run on the server, will run on time in their timezone?
It appears that simply specifying the timezone is not enough; I specify the timezone like this
dailyTrigger.TimeZone = BrainTimeZone;
but on the server that holds the quartz instance (in PST) gets a job scheduled for 2:00pm in NYC (EST), the "Next Run Time" should be 2:00pm, but it shows and runs at noon.
Here are a few excellent s/o articles on Quartz Time Zones:
Quartz.net UTC Resources:
Quartz.NET - Using/understanding cron based trigger and time zone/summertime (daylight saving time)
What time am I dealing with in Quartz.net?
Quartz .NET MakeDailyTrigger
Here is how I currently schedule a daily:
private void CreateDaily()
{
var expression = CronScheduleBuilder
.DailyAtHourAndMinute(GetNormalizedHour(), Minute)
.InTimeZone(TimeZone)
.Build() as CronTriggerImpl;
IJobExecutionContext jobContext = GetJobContext();
IJobDetail job = JobBuilder.Create<MailJob>()
.WithIdentity(JobName, GroupName)
.UsingJobData(jobContext.JobDetail.JobDataMap)
.Build();
ScheduleBuilder<>cronExpressionString
var cronExpressionString = expression.CronExpressionString; // returns a cron expr.
var dailyTrigger = (ICronTrigger)TriggerBuilder.Create()
.WithIdentity(JobName, GroupName)
.WithSchedule(cronExpressionString)
.Build();
dailyTrigger.TimeZone = BrainTimeZone;
this.JobTrigger = dailyTrigger;
this.JobDetail = job;
this.Success = true;
}
I tried to use a DailyTimeIntervalTriggerImpl, but this does not seem like the right trigger for any of those 3 above interval types.
private void DailyJob()
{
#region Duration
var daysOfWeek = new Quartz.Collection.HashSet<System.DayOfWeek>
{
System.DayOfWeek.Monday,
System.DayOfWeek.Tuesday,
System.DayOfWeek.Wednesday,
System.DayOfWeek.Thursday,
System.DayOfWeek.Friday,
System.DayOfWeek.Saturday,
System.DayOfWeek.Sunday,
};
DateTimeOffset startTime = DateTime.Now;
DateTimeOffset endTime = DateTime.Now.AddYears(1);
TimeOfDay startTimeOfDay = TimeOfDay.HourMinuteAndSecondOfDay(Hour, Minute, 0);
TimeOfDay endTimeOfDay = TimeOfDay.HourMinuteAndSecondOfDay(Hour, Minute, 30);
#endregion
IJobExecutionContext jobContext = GetJobContext();
if (JobName == null || GroupName == null) {
this.Success = false;
return;
}
var dailyTrigger = new DailyTimeIntervalTriggerImpl
{
StartTimeUtc = startTime.ToUniversalTime(),
EndTimeUtc = endTime.ToUniversalTime(),
StartTimeOfDay = startTimeOfDay,
EndTimeOfDay = endTimeOfDay,
RepeatIntervalUnit = IntervalUnit.Week,
DaysOfWeek = daysOfWeek,
// RepeatInterval = 1,
TimeZone = TimeZone,
Key = new TriggerKey(JobName, GroupName),
};
// Compute fire times just to show simulated fire times
IList<DateTimeOffset> fireTimes = TriggerUtils.ComputeFireTimes(dailyTrigger, null, 1000);
foreach (var dateTimeOffset in fireTimes)
{
QuartzLog("Daily trigger has been computed - fireTimes as follows:\r\n\r\n");
QuartzLog(string.Format("utc:{0} - adjusted time:{1} - timezone:{2}", dateTimeOffset,
TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime, BrainTimeZone), BrainTimeZone.DisplayName));
}
I am in the process of refactoring all my quartz layers, so I am looking for best practices and a bullet proof method of assuring that jobs will run at the times we specify, regardless of where the Quartz.net job server is located, and where the user's time zone originated from and where they want it to end up arriving at.
We are moving our quartz.net servers to AWS so we will have a distributed server farm to host these with timezones that can change.
How can I set up my quartz architecture so that it is dynamic enough and as I stated above, bullet proof, in sending jobs on time - regardless of TimeZones / Offsets / DaylightSavings / LeapYear / Sleat / Snow / Rain / Zombie Attacks / Y2K / Meteoric ELE / etc. ?
Thank you.

Resources