Автоматический выключатель Monix с Http-запросом - PullRequest
0 голосов
/ 05 июля 2019

Я изо всех сил пытаюсь заставить автоматический выключатель Monix работать асинхронно с некоторым запросом, который я получаю в моем сервисе, и который не выполняется, поэтому он должен активировать автоматический выключатель, и даже когда он разомкнут, он должен сделатьзапрос.

Здесь мой код

 @GET
  def XXXX(@Suspended asyncResponse: AsyncResponse): Unit = {
    val circuitBreaker = breaker.doOnOpen(eval.Task {
      logger.error(null, "Circuit breaker change state to open")
      asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE.getStatusCode))
    })
      .doOnHalfOpen(eval.Task(logger.error(null, "Circuit breaker change state to half-open")))
      .doOnClosed(eval.Task(logger.error(null, "Circuit breaker change state to close")))
    val staticToggleProgram: ZIO[Any, Throwable, Boolean] =
      (for {
        staticToggle <- toggleService.getStaticToggle()
        state <- renderResponse(asyncResponse, staticToggle)
      } yield state).catchAll(t => {
        logger.error(null, s"Toggle Error handler. Unhandled effect $t")
        asyncResponse.resume(Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode))
        ZIO.fail(t)
      })
    val task = eval.Task(main.unsafeRun(staticToggleProgram))
    circuitBreaker.protect(task).runAsync
  }

Кажется, что когда асинхронно, AsyncResponse, который используется в обратном вызове выключателя, когда он открыт, переопределяется следующим запросом, которыйприбыть, и тогда мой сервис застрянет, и больше не будет приходить запрос.

Пока единственное решение - запустить его Sync, но это не вариант, так как это должен быть NIO

circuitBreaker.protect(task).runSyncMaybe
...