Monix: Version 2.0.4 Released for Bug Fixing
This release is binary compatible with 2.0.x, being a bug fix release
for Issue #244:
AsyncScheduler.scheduleAtFixedRate and scheduleWithFixedDelay on the JVM
have incorrect behavior.
In order to upgrade, just increment the version number in build.sbt:
libraryDependencies += "io.monix" %% "monix" % "2.0.4"
Details #
The AsyncScheduler.scheduleAtFixedRate method implementation has
incorrect behavior and this includes monix.execution.Scheduler.Implicits.global.
Sample:
import java.util.concurrent.TimeUnit
monix.execution.Scheduler.Implicits.global
global.scheduleAtFixedRate(1, 2, TimeUnit.SECONDS, runnable)
global.scheduleWithFixedDelay(1, 2, TimeUnit.SECONDS, runnable)
What happens is that if the given runnable takes more than 2 seconds to
execute, then subsequent runnables are going to be executed concurrently,
without waiting for the current runnable to finish. So if runnables are
slow, you can end up with 2 or even more runnables being executed
at the same time.
This happens because this periodic scheduling is deferred to the global
Scheduler.DefaultScheduledExecutor instance, a single threaded Java
ScheduledExecutor that then defers the actual execution of the task to the
ForkJoinPool in charge of the actual execution. But by doing this deferring,
the time it takes that runnable to execute is not taken into account at all.
This behavior is inconsistent with how these operations work for Java’s
ScheduledExecutor and with how they are documented in ScalaDoc.
NOTE: this behavior does NOT happen for ExecutorScheduler
(e.g. Scheduler.io, Scheduler.fixedPool, Scheduler.singleThread)
or any of the 2 available scheduler implementations for Javascript.
It also doesn’t affect Observable.interval, Observable.intervalWithFixedDelay
and Observable.intervalAtFixedRate. These observable builders have had
correct behavior, regardless of the scheduler used.
The fix involves the AsyncScheduler implementation to piggy-back on the
implementation in ReferenceScheduler, just like the Javascript scheduler
implementations.
Cheers,