Main idea here is to add Quartz (http://quartz-scheduler.org/) calendars and crons to rx-java (https://github.com/Netflix/RxJava) schedulers. It is a "forwarding" scheduler implementation, so one can change the "inner" scheduler (to replace it by a TestScheduler for example) at will.
Available at clojars (https://clojars.org/com.ullink.rx/rx-cron-scheduler).
1/ Add a clojars repo. If you use gradle following should be enough:
repositories {
mavenRepo url: 'http://clojars.org/repo'
}
2/ Add a dependency to your project. Using gradle:
compile 'com.ullink.rx:rx-cron-scheduler:1.5'
static class SideEffectTask implements Action0
{
@Override
public void call() {
.. some stuff ...
}
}
ExecutorService executor = Executors.newSingleThreadScheduledExecutor();
Scheduler inner = Schedulers.executor(executor);
RxCronScheduler service = new RxCronForwardingScheduler(inner);
final SideEffectTask task = new SideEffectTask();
WeeklyCalendar weeklyCalendar = new WeeklyCalendar();
boolean [] excluded = new boolean [] {false, false, true, true,true,true,true, true};
weeklyCalendar.setDaysExcluded(excluded);
service.schedule(task, new CronExpression("0 0 15 ? * *"), weeklyCalendar );