11package org .tmt .embedded_keycloak .impl
22
3+ import java .util .concurrent .atomic .AtomicInteger
34import java .util .{Timer , TimerTask }
45
56import org .tmt .embedded_keycloak .Settings
@@ -12,18 +13,32 @@ import scala.util.Try
1213import scala .util .control .NonFatal
1314
1415private [embedded_keycloak] class HealthCheck (settings : Settings ) {
15- def checkHealth (): Future [Unit ] = retry[Response ](makeCall()).map(_ => ())
1616
17- private def retry [T ](f : => Future [T ], attempts : Int = 10 , interval : FiniteDuration = 3 .seconds): Future [T ] = {
17+ /**
18+ * This ID is used to generate thread names.
19+ */
20+ private val nextSerialNumber = new AtomicInteger (0 )
21+ private def serialNumber = nextSerialNumber.getAndIncrement
22+
23+ def checkHealth (): Future [Unit ] = {
24+ val timer = new Timer (s " embedded-keyclock-timer- $serialNumber" )
25+ retry[Response ](makeCall(), timer = timer)
26+ .transform(_ => Try (timer.cancel()))
27+ }
28+
29+ private def retry [T ](f : => Future [T ],
30+ attempts : Int = 10 ,
31+ interval : FiniteDuration = 3 .seconds,
32+ timer : Timer ): Future [T ] = {
1833 f.recoverWith {
19- case NonFatal (_) if attempts > 0 => delay(interval) { retry(f, attempts - 1 , interval) }.flatten
34+ case NonFatal (_) if attempts > 0 =>
35+ delay(interval, timer) { retry(f, attempts - 1 , interval, timer) }.flatten
2036 }
2137 }
2238
23- def delay [T ](delay : FiniteDuration )(block : => T ): Future [T ] = {
39+ def delay [T ](delay : FiniteDuration , timer : Timer )(block : => T ): Future [T ] = {
2440 val promise = Promise [T ]()
25- val t = new Timer ()
26- t.schedule(new TimerTask {
41+ timer.schedule(new TimerTask {
2742 override def run (): Unit = {
2843 promise.complete(Try (block))
2944 }
0 commit comments