Skip to content

Instantly share code, notes, and snippets.

@jchapuis
Created May 10, 2020 20:06
Show Gist options
  • Save jchapuis/ab5e086d372f48ea6a5595c33a6276ef to your computer and use it in GitHub Desktop.
Save jchapuis/ab5e086d372f48ea6a5595c33a6276ef to your computer and use it in GitHub Desktop.
Markdium-Orchestrating startup and shutdown in Scala
object CoordinatedShutdownHttpHelpers {
implicit class FluentHttpCoordinatedShutdown(coordinatedShutdown: CoordinatedShutdown)(
implicit val system: ActorSystem
) {
private implicit val executionContext: ExecutionContext = system.dispatcher
def addHttpBinding(
binding: Http.ServerBinding,
pendingRequestsHardDeadline: FiniteDuration,
unbindingDelay: FiniteDuration
): CoordinatedShutdown = {
val addressAndPort = s"${binding.localAddress.getHostString}:${binding.localAddress.getPort}"
coordinatedShutdown
.serviceUnbind(
() => akka.pattern.after(unbindingDelay, system.scheduler)(binding.unbind()),
s"http-unbind-$addressAndPort"
)
.serviceRequestsDone(
() => binding.terminate(pendingRequestsHardDeadline).map(_ => Done),
s"http-graceful-terminate-$addressAndPort"
)
.serviceStop(() => Http().shutdownAllConnectionPools().map(_ => Done), s"http-done-$addressAndPort")
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment