我有一个MonixScheduler
,它调度容易出错的任务:
import scala.concurrent.duration._
import monix.eval.Task
import monix.execution.Scheduler
import java.time._
scheduler.scheduleWithFixedDelay(0.seconds, 1.seconds) {
IO(println("qq"))
.map{ _ =>
if (Instant.now.getEpochSecond % 5 == 0)
throw new Exception()
}
.unsafeRunSync()
}
问题是——如果调度程序内部的任务抛出异常,则调度程序将停止,并且异常不会传播到主程序。我想让主程序得到异常并处理它(事实上我想停止整个程序(
我可以在内部调用sys.exit()
,但我认为这并不理想,因为父进程应该监督子进程。
当使用Task
时,我可以通过task.runSyncUnsafe()
从主程序中捕获它,对于Scheduler
,有没有同样的方法?
由于调度程序异步运行,因此无法捕获异常。
如果您使用的是cats-effect IO(或monix Task(,则可以使用.tempt,然后在非此即彼上使用左映射来处理异常。但您必须明确取消计划的作业。