Skip to content

Commit

Permalink
add retry policy to http clients
Browse files Browse the repository at this point in the history
  • Loading branch information
jbwheatley committed Aug 31, 2021
1 parent e913e7c commit 18d78b7
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 22 deletions.
22 changes: 11 additions & 11 deletions example/consumer/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@ lazy val pactVersionFile: SettingKey[File] = settingKey[File]("location of scala
pactVersionFile := baseDirectory.value.getParentFile.getParentFile / "version.sbt"

libraryDependencies ++= {
//A hack so we don't have to manually update the scala-pact version for the examples
lazy val pactVersion = IO.read(pactVersionFile.value).split('"')(1)
Seq(
"com.itv" %% "scalapact-circe-0-13" % pactVersion % "test",
"com.itv" %% "scalapact-http4s-0-21" % pactVersion % "test",
"com.itv" %% "scalapact-scalatest" % pactVersion % "test",
"org.scalaj" %% "scalaj-http" % "2.4.2",
"org.slf4j" % "slf4j-simple" % "1.6.4",
"org.json4s" %% "json4s-native" % "3.6.9",
"org.scalatest" %% "scalatest" % "3.0.8" % "test"
)
//A hack so we don't have to manually update the scala-pact version for the examples
lazy val pactVersion = IO.read(pactVersionFile.value).split('"')(1)
Seq(
"com.itv" %% "scalapact-circe-0-14" % pactVersion % "test",
"com.itv" %% "scalapact-http4s-0-23" % pactVersion % "test",
"com.itv" %% "scalapact-scalatest" % pactVersion % "test",
"org.scalaj" %% "scalaj-http" % "2.4.2",
"org.slf4j" % "slf4j-simple" % "1.6.4",
"org.json4s" %% "json4s-native" % "3.6.9",
"org.scalatest" %% "scalatest" % "3.0.8" % "test"
)
}

scalaPactEnv := ScalaPactEnv.defaults.withPort(8080)
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ class SingletonStubProviderClientSpec extends FunSpec with Matchers with BeforeA
import com.itv.scalapact.ScalaPactForger._

// Import the json and http libraries specified in the build.sbt file
import com.itv.scalapact.circe13._
import com.itv.scalapact.http4s21._
import com.itv.scalapact.circe14._
import com.itv.scalapact.http4s23._

implicit val formats: DefaultFormats.type = DefaultFormats

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ class StubPerTestProviderClientSpec extends FunSpec with Matchers {
import com.itv.scalapact.ScalaPactForger._

// Import the json and http libraries specified in the build.sbt file
import com.itv.scalapact.circe13._
import com.itv.scalapact.http4s21._
import com.itv.scalapact.circe14._
import com.itv.scalapact.http4s23._

implicit val formats = DefaultFormats

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@
"version" : "2.0.0"
},
"scala-pact" : {
"version" : "3.2.2-SNAPSHOT"
"version" : "4.0.0-SNAPSHOT"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@
"version" : "2.0.0"
},
"scala-pact" : {
"version" : "3.2.2-SNAPSHOT"
"version" : "4.0.0-SNAPSHOT"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package com.itv.scalapact.http4s21.impl

import cats.effect.{ContextShift, IO, Resource}
import cats.effect.{ContextShift, IO, Resource, Timer}
import com.itv.scalapact.shared.http.{SimpleRequest, SimpleResponse, SslContextMap}
import com.itv.scalapact.shared.utils.PactLogger
import org.http4s._
import org.http4s.client.Client
import org.http4s.client.blaze.BlazeClientBuilder
import org.http4s.client.middleware.{Retry, RetryPolicy}
import org.http4s.headers.{AgentProduct, `User-Agent`}

import scala.concurrent.ExecutionContext
Expand All @@ -14,12 +15,13 @@ import scala.concurrent.duration._
object Http4sClientHelper {

def defaultClient: Resource[IO, Client[IO]] =
buildPooledBlazeHttpClient(1, Duration(5, SECONDS), None)
buildPooledBlazeHttpClient(1, 5.seconds, None)

def buildPooledBlazeHttpClient(maxTotalConnections: Int, clientTimeout: Duration, sslContextName: Option[String])(
implicit sslContextMap: SslContextMap
): Resource[IO, Client[IO]] = {
implicit val cs: ContextShift[IO] = IO.contextShift(ExecutionContext.global)
implicit val timer: Timer[IO] = IO.timer(ExecutionContext.global)
val sslContext = sslContextMap(sslContextName)
val builder = BlazeClientBuilder[IO](ExecutionContext.Implicits.global)
.withMaxTotalConnections(maxTotalConnections)
Expand All @@ -30,7 +32,14 @@ object Http4sClientHelper {
s"Creating http4s client: connections $maxTotalConnections, timeout $clientTimeout, sslContextName: $sslContextName, sslContextMap: $sslContextMap"
)

sslContext.fold(builder)(s => builder.withSslContext(s)).resource
sslContext.fold(builder)(s => builder.withSslContext(s)).resource.map {
Retry[IO](
RetryPolicy(
RetryPolicy.exponentialBackoff(30.seconds, 5),
RetryPolicy.defaultRetriable
)
)
}
}

def doRequest(request: SimpleRequest, httpClient: Resource[IO, Client[IO]]): IO[SimpleResponse] =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.itv.scalapact.shared.utils.PactLogger
import org.http4s._
import org.http4s.blaze.client.BlazeClientBuilder
import org.http4s.client.Client
import org.http4s.client.middleware.{Retry, RetryPolicy}
import org.http4s.headers.`User-Agent`

import scala.concurrent.ExecutionContext
Expand All @@ -14,7 +15,7 @@ import scala.concurrent.duration._
object Http4sClientHelper {

def defaultClient: Resource[IO, Client[IO]] =
buildPooledBlazeHttpClient(1, Duration(5, SECONDS), None)
buildPooledBlazeHttpClient(1, 5.seconds, None)

def buildPooledBlazeHttpClient(maxTotalConnections: Int, clientTimeout: Duration, sslContextName: Option[String])(
implicit sslContextMap: SslContextMap
Expand All @@ -29,7 +30,14 @@ object Http4sClientHelper {
s"Creating http4s client: connections $maxTotalConnections, timeout $clientTimeout, sslContextName: $sslContextName, sslContextMap: $sslContextMap"
)

sslContext.fold(builder)(s => builder.withSslContext(s)).resource
sslContext.fold(builder)(s => builder.withSslContext(s)).resource.map {
Retry(
RetryPolicy(
RetryPolicy.exponentialBackoff(30.seconds, 5),
RetryPolicy.defaultRetriable
)
)
}
}

def doRequest(request: SimpleRequest, httpClient: Resource[IO, Client[IO]]): IO[SimpleResponse] =
Expand Down

0 comments on commit 18d78b7

Please sign in to comment.