hmm, SchedulerException is used for two very different things; receiver terminated and when the scheduler is stopped. When scheduler is stopped it is converted to IllegalStateException (which is part of the contract).
Feels fragile, I think you should use two different exceptions.

Also, is SchedulerException ever exposed to users? Make it private?