scala.concurrent.Future
を安全便利に扱うためのライブラリ、Failurewall の新バージョンをリリースしました。
テストコードやビルド設定のリファクタリングを除くと、変更は以下の二点です。
- StopwatchFailurewall 追加
- Scala 2.12 対応
変更点
StopwatchFailurewall
Future
が完了するまでの経過時間を計測することができます。
val failurewall = StopwatchFailurewall[String](executionContext) val result = failurewall.call(Future { Thread.sleep(100) "mofu" }) result.toString // Success((Success(mofu),107716546 nanoseconds))
成功時には上記のように (Success[A], FiniteDuration)
が、失敗時には (Failure[A], FiniteDuration)
が返ります。
val result = failurewall.call(Future { Thread.sleep(100) throw new RuntimeException("mofu") }) result.toString // Success((Failure(java.lang.RuntimeException: mofu),105863733 nanoseconds))
実行に時間がかかっている処理をログを出力したり、
failurewall.call(Future { Thread.sleep(3000) "mofu" }).andThen { case Success((_, time)) if time >= 3000.millis => logger.warn(s"It took $time to do mofu") }
ありえんくらいレスポンスが遅い場合に CircuitBreaker
の失敗カウンタを増加させたりといった使い方ができます。
val stopwatchFailurewall = StopwatchFailurewall[String](executionContext) val akkaCircuitBreakerFailurewall = AkkaCircuitBreakerFailurewall.withFeedback[(Try[String], FiniteDuration)](akkaCircuitBreaker, executionContext) { case Success((Success(_), time)) if time < 3000.millis => Available case Success((Success(_), _)) => Unavailable case Success((Failure(_), _)) => Unavailable case Failure(_) => throw new AssertionError("never happens") } val failurewall = akkaCircuitBreakerFailurewall compose stopwatchFailurewall
Scala 2.12 対応
Failurewall
は serious scala project なので、xuwei-k さんが対応してくれました。