If you want your program to run forever with automatic error recovery you can choose to run your program in a loop that will restart every certain amount of specified time with an exponential backoff then ResilientStream is all you’re looking for.

For a given Fs2 Rabbit program defined as Stream[F, Unit], a resilient app will look as follow:

import cats.effect.IO
import dev.profunktor.fs2rabbit.resiliency.ResilientStream
import fs2._

import scala.concurrent.ExecutionContext
import scala.concurrent.duration._

implicit val timer = IO.timer(

val program: Stream[IO, Unit] = Stream.eval(IO.unit), 1.second)

This program will run forever and in the case of failure it will be restarted after 1 second and then exponentially after 2 seconds, 4 seconds, 8 seconds, etc.

For a program defined as F[Unit] see the equivalent ResilientStream.runF.

See the examples to learn more!