我需要在我的Play 2.3应用程序中添加一个WebSocket-to-TCP代理,但是当使用Akka I / O的传出TCP连接支持反压时,我看不到WebSocket的任何内容。基于actor的API显然没有支持,但是James Roper says:
Iteratees通过设计处理此问题,您无法将新元素提供给 iteratee直到最后一次它返回已被兑换,因为你 直到那时才提及它。
然而,我看不出他所指的是什么。示例中使用的Iteratee.foreach
似乎过于简单。我在iteratee API中看到的唯一未来是用于完成计算的结果。我应该为每条消息完成Future[Unit]
还是什么?
答案 0 :(得分:4)
Iteratee.foldM
允许将状态传递到每个步骤,就像常规折叠操作一样,并返回未来。如果你没有这样的状态,你可以通过Unit
,它将作为一个foreach,在将来完成之前不会接受下一步。
以下是实用程序功能的一个示例:
def foreachM[E](f: E => Future[Unit])(implicit ec: ExecutionContext): Iteratee[E, Unit] =
Iteratee.foldM[E, Unit](Unit)((_, e) => f(e))
答案 1 :(得分:2)
Iteratee
与Iterator
不同。 Iteratee
确实固有地支持背压(实际上你会发现自己遇到了相反的问题 - 默认情况下他们不会做任何缓冲(至少在管道内 - 当然异步套接字仍有接收缓冲区) ),因此有时您必须向枚举器/迭代管道添加显式缓冲步骤以获得合理的性能)。这些示例看起来很简单,但这只意味着框架正在执行框架所做的事情并使事情变得简单。如果您在处理程序中执行大量工作或进行异步调用,则不应使用简单的Iteratee.foreach
,而应使用接受基于Future
的处理程序的API ;如果你在 Iteratee
中阻止,那么你就会阻止整个事情,浪费你的线程,并且完全无法使用它们。