Scala:接收服务器发送事件

时间:2014-05-16 19:22:08

标签: scala http playframework-2.0 server-sent-events spray

设置向上:

我正在处理的项目有一个带有HTTP接口的pub / sub服务器。订阅通过接受服务器发送事件来工作。

curl -X GET server:port/topics/news
每当邮件发布到给定主题URL

时,都会推送

curl -X PUT server:port/topics/news -d "Politician Lies!"

问题:

我有一个scala项目需要订阅这个pub / sub服务器。表演!框架能够通过使用带有Enumeratee + Iteratee的PlayWS来处理这个问题。不幸的是,PlayWS库需要Play!应用程序在范围内,我不使用Play。是否有一个库(具有最小的依赖性)我可以使用它允许我接受服务器发送事件?我需要至少一个工作示例才能开始。

我偏爱scala库,但如果必须,我愿意接受Java解决方案。

3 个答案:

答案 0 :(得分:4)

我接受了Manuel Bernhardt的回答,因为它引导我朝着正确的方向前进,但我觉得一个完整的例子对于这个问题的其他任何人都很重要。

我更新了build.sbt文件以包含PlayWS 2.3和Iteratees库。

libraryDependencies ++= Seq(
  "com.typesafe.play" %% "play-ws" % "2.3.0",
  "com.typesafe.play" %% "play-iteratees" % "2.3.0"
)

WS单例需要使用隐式Play应用程序(我不喜欢或不想要的东西),所以我需要创建自己的客户端

val builder = new (com.ning.http.client.AsyncHttpClientConfig.Builder)()
val client = new play.api.libs.ws.ning.NingWSClient(builder.build())

然后我创建了我的Iteratee,以便我可以处理我的服务器发送事件。

def print = Iteratee.foreach { chunk: Array[Byte] => 
  println(new String(chunk))
}

最后订阅服务器

client.url("http://localhost:8080/topics/news").get(_ => print)

现在,发送一个事件

curl -X PUT server:port/topics/news -d "Politician Lies!"

我的Scala应用程序将打印收到的事件

data: Politician Lies!

答案 1 :(得分:3)

您有几种可能性:

在Play 2.3中,the WS library is now a separate library,这应该有所帮助。 RC2已经可用

或者,您可以依赖Play 2.x并使用StaticApplication,如下所示:

val application = new StaticApplication(new java.io.File("."))

这基本上是引导Play应用程序,从那里你可以像往常一样使用WS

答案 2 :(得分:2)

我不知道实现Server Sent Events客户端的其他Scala库,但Jersey项目有Java library for Server Sent Events clients(以及服务器)。 API看起来并不是非常冗长,看起来它可以很好地包装在一些代码中,以便更加适合Scala。

相关问题