Akka Stream,功能来源?

时间:2017-04-24 13:57:10

标签: scala akka akka-stream

我希望有一个Source以给定的时间间隔评估函数并发出其输出。作为一种解决方法,我可以使用Source.queue + offer执行此操作,但尚未找到更清晰的方法。理想情况下,我会有像

这样的东西
def myFunction() = ....                     // function with side-effects 
Source.tick(1.second, 1.second, myFunction) // myFunction is evaluated at every tick

有什么想法吗?

2 个答案:

答案 0 :(得分:12)

可能最干净的方法是使用map

Source.tick(1.second, 1.second, NotUsed).map(_ ⇒ myFunction())

答案 1 :(得分:1)

我猜,throttle就是你所需要的。将Source应用于iterable的完全可运行的示例,该示例使用next()中的函数:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.ThrottleMode.Shaping
import akka.stream.scaladsl.Source

import scala.concurrent.duration._

implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
var i = 0

def myFunction(): Int = {
  i = i + 1
  i
}

import scala.collection.immutable.Iterable

val x: Iterable[Int] = new Iterable[Int] {
  override def iterator: Iterator[Int] =
    new Iterator[Int] {
      override def hasNext: Boolean = true

      override def next(): Int = myFunction()
    }
}
Source(x).throttle(1, 1.second, 1, Shaping).runForeach(println)

throttle参数:节流源每1秒有1个元素,最大突发数为1,在发出消息之前暂停以满足节流速率(即Shaping为什么)。