Scala:接收服务器发送的事件

Scala:接收服务器发送的事件,scala,http,playframework-2.0,server-sent-events,spray,Scala,Http,Playframework 2.0,Server Sent Events,Spray,设置: 我正在处理的一个项目有一个带有HTTP接口的发布/订阅服务器。订阅通过接受服务器发送的事件来工作 curl -X GET server:port/topics/news 每当消息发布到给定的主题URL时,都会推送它 curl -X PUT server:port/topics/news -d "Politician Lies!" 问题: 我有一个scala项目需要订阅这个发布/订阅服务器。这出戏!框架可以通过使用带有Enumerate+Iteratee的PlayWS来处理这个问题。不

设置:

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

curl -X GET server:port/topics/news
每当消息发布到给定的主题URL时,都会推送它

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

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


我喜欢scala库,但如果有必要,我愿意接受Java解决方案。

我不知道还有其他scala库实现服务器发送事件客户端,但Jersey项目有一个(以及服务器)。API看起来不是很冗长,似乎可以很好地包装在一些代码中,以便更习惯地与Scala配合使用。

您有几种可能性:

在游戏2.3中,这应该会有所帮助。RC2已经可用

或者,您可以依赖Play 2.x并使用
静态应用程序
,如下所示:

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

这将从本质上引导一个Play应用程序,从那时起,您可以像往常一样使用
WS

我接受了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-singleton需要使用隐式播放应用程序(我没有或不想要),因此我需要创建自己的客户端

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但我仍在等待Scala的选择,因为SBT中的artifact
javax.ws.rsAPI
似乎阻止了这一点的使用:这看起来很有希望。在创建此问题之前,我在使用PlayWS 2.2库时遇到了一些问题。您是否能够创建一个使用PlayWS接受SSE的自包含示例?