Scala Monix, как убить запущенную или запланированную задачу - PullRequest
0 голосов
/ 14 мая 2018

Я использую Monix для рабочего процесса асинхронной задачи.

Как убить бегущего Task?

Task{ println("sleep")
      Thread.sleep(200)
      println("effect") }
.doOnCancel(Task(println("canceled")))
.timeout(100.milli) // timeout will do cancel
.runOnComplete(println)

@> Failure(java.util.concurrent.TimeoutException: Task timed-out after 100 milliseconds of inactivity) sleep canceled effect <--- what !? , task is running. Isn't it canceled !?

Мое текущее решение, на мой взгляд, безобразно (проверка флага мешает повторному использованию кода):

var flag=true
Task{ 
      println("sleep")
      Thread.sleep(200)
      if (flag)
        println("effect") 
}
.doOnCancel(Task{ flag=false; println("canceled") })
.timeout(100.milli) // timeout will do cancel

Если это невозможно, как убить запланированное, пока еще не выполненное Task?

Моя неудачная попытка:

Task{ println("sleep"); Thread.sleep(200) }
.map{ _ => println("effect") }
.doOnCancel(Task(println("canceled")))
.timeout(100.milli) // timeout will do cancel
.runOnComplete(println)

К сожалению, он все еще показывает эффект после отмены. Я надеюсь, что запланированное и еще не выполненное задание можно отменить (.map(...) - это еще один Task, верно?)

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Если вы не используете Thread.sleep (что портится с внутренностями Monix), но Task.sleep, все работает просто отлично.

Task
  .defer {
    println("start")
    Task.sleep(1000.millis)
  }
  .map(_ => println("effect"))
  .timeout(10.millis)
  .doOnCancel(Task(println("canceling")))

Теперь вопрос в том, каков ваш реальный вариант использования, потому что я уверен, что вы использовали Thread.sleep только для иллюстрации.

0 голосов
/ 14 мая 2018

Я нашел одно из решений, если это цепочка задач:

Task{println("start");Thread.sleep(1000)}
 .asyncBoundary
 .map{_=> println("effect")}
 .doOnCancel(Task(println("canceling")))
 .timeout(10.milli)
 .executeWithOptions(_.enableAutoCancelableRunLoops)
 .runOnComplete(println)

ссылка: https://github.com/monix/monix/issues/226

Но я надеюсь, что есть простой способ прервать задачу вместо использования задач закрытия или разделения и цепочки.

...