2014-05-16 7 views
8

Ustawianie:Scala: Odbieranie Server-Sent-Events

Projekt pracuję nad znajduje się pub/serwera podrzędnego z interfejsu HTTP. Subskrypcja działa poprzez akceptowanie zdarzeń wysłanych przez serwer.

curl -X GET server:port/topics/news 

który zostanie wciśnięty, gdy wiadomość zostanie opublikowana do danego tematu URL

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

Problem:

Mam projektu scala które musi zapisać się do tego pubu/sub serwer. Sztuka teatralna! framework radzi sobie z tym za pomocą PlayWS z Enumeratee + Iteratee. Niestety, biblioteka PlayWS wymaga Play! Aplikacja jest w zakresie i nie używam Play. Czy istnieje biblioteka (z minimalnymi zależnościami), z której mogę korzystać, co pozwala mi akceptować zdarzenia wysłane przez serwer? Aby zacząć, potrzebuję przynajmniej jednego działającego przykładu.

Mam preferencje dla bibliotek scala, ale jestem skłonny zaakceptować rozwiązanie Java, jeśli muszę.

Odpowiedz

3

Masz kilka możliwości:

w grze 2.3 the WS library is now a separate library, tak że powinno pomóc. RC2 jest już dostępny

Alternatywnie, można zależą Gra 2.x i używać StaticApplication tak:

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

To będzie w zasadzie bootstrap aplikacji Play, a stamtąd można użyć biblioteki WS jak zwykle

+0

To wygląda obiecująco. Przed utworzeniem tego pytania miałem problemy z używaniem biblioteki PlayWS 2.2. Czy jesteś w stanie stworzyć samodzielny przykład używania PlayWS do akceptacji SSE? –

2

Nie jestem świadomy innych bibliotek Scala, które implementują klienta Server Sent Events, ale projekt Jersey ma numer Java library for Server Sent Events clients (a także serwery). Interfejs API nie wydaje się być bardzo szczegółowy i wygląda na to, że może być ładnie zawinięty w jakiś kod, aby pasował bardziej idiomalnie do Scali.

+0

ja zbadałem ta opcja przed postawieniem tego pytania. Musiałbym napisać opakowanie, ale narzut byłby mały. +1, ale wciąż czekam na opcję Scala –

+0

Problem z artefaktem 'javax.ws.rs-api' w SBT wydaje się blokować użycie tego, w tym momencie: https://github.com/gradle/gradle/issues/3065 –

4

Przyjąłem odpowiedź Manuela Bernhardta, ponieważ doprowadziło mnie to we właściwym kierunku, ale uważam, że pełny przykład jest ważny dla wszystkich osób z tym problemem.

Zaktualizowałem mój plik build.sbt tak, aby zawierał bibliotekę PlayWS 2.3 i bibliotekę Iteratees.

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

WS Singleton wymaga niejawny Odtwórz aplikacji ma być używany (coś, czego nie mają lub chcą), więc zamiast tego będę musiał tworzyć własne klientowi

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

Następnie tworzę Iteratee dzięki czemu mogę obsługiwać moje zdarzenia wysłane przez serwer.

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

i wreszcie zapisać się na serwerze

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

Teraz, gdy zdarzenie jest wysyłane

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

Moja aplikacja Scala wydrukować odebranego zdarzenia

data: Politician Lies!