gpt4 book ai didi

scala - 在scala中实现长轮询并用akka玩2.0

转载 作者:行者123 更新时间:2023-12-02 18:12:01 25 4
gpt4 key购买 nike

我正在 Play 2.0 中的潜在分布式环境中实现长轮询。我的理解是,当 Play 收到请求时,它应该暂停挂起的更新通知,然后转到数据库获取新数据并重复。我开始查看 Play 2.0 提供的聊天示例,但它是在 websocket 中。此外,它看起来并不能够被分发。所以我想我会使用Akka的事件总线。我采用了事件流实现,并使用 LookupClassification 复制了我自己的实现。然而,我对如何收到消息感到困惑(或者就此而言,订阅者应该是什么而不是 ActorRef)?

EventStream 实现: https://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/event/EventStream.scala

最佳答案

我不确定这就是您正在寻找的,但是 comet-clock 示例中有一个非常简单的解决方案,您可以适应使用 AKKA Actor 。它使用无限 iframe 而不是长轮询。我已经使用了一个更复杂的应用程序的改编版本,在 AKKA 参与者中执行多个数据库调用和长时间计算,并且它工作得很好。

  def enum = Action {
//get your actor
val myActorRef = Akka.system.actorOf(Props[TestActor])

//do some query to your DB here. Promise.timeout is to simulate a blocking call
def getDatabaseItem(id: Int): Promise[String] = { Promise.timeout("test", 10 milliseconds) }

//test iterator, you will want something smarter here
val items1 = 1 to 10 toIterator

// this is a very simple enumerator that takes ints from an existing iterator (for an http request parameters for instance) and do some computations
def myEnum(it: Iterator[Int]): Enumerator[String] = Enumerator.fromCallback[String] { () =>
if (!items1.hasNext)
Promise.pure[Option[String]](None) //we are done with our computations
else {

// get the next int, query the database and compose the promise with a further query to the AKKA actor
getDatabaseItem(items1.next).flatMap { dbValue =>
implicit val timeout = new Timeout(10 milliseconds)
val future = (myActorRef ? dbValue) mapTo manifest[String]

// here we convert the AKKA actor to the right Promise[Option] output
future.map(v => Some(v)).asPromise
}
}
}

// finally we stream the result to the infinite iframe.
// console.log is the javascript callback, you will want something more interesting.
Ok.stream(myEnum(items1) &> Comet(callback = "console.log"))
}

请注意,此 fromCallback 不允许您将枚举器与“andThen”组合起来,如果您想使用组合,在 play2 的主干版本中有一个generateM 方法可能更合适。

轮询时间不长,但效果很好。

关于scala - 在scala中实现长轮询并用akka玩2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com