Scala: Получение Сервера-Отправлено-События

настройки:

проект, над которым я работаю, имеет сервер pub/sub с интерфейсом HTTP. Подписка работает, принимая сервер-отправленные-события.

curl -X GET server:port/topics/news

который будет нажат всякий раз, когда сообщение публикуется в данной теме URL

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

:

у меня есть проект scala, который должен подписаться на этот сервер pub/sub. Пьеса! framework может справиться с этим, используя PlayWS с Enumeratee + Iteratee. К сожалению, библиотека PlayWS требует, чтобы играть! Приложение находится в области, и я не использую Play. Есть ли библиотека (с минимальными зависимостями), которую я могу использовать, которая позволяет мне принимать серверные отправленные события? Для начала мне понадобится хотя бы один рабочий пример.

у меня есть предпочтение библиотек scala, но я готов принять решение Java, если придется.

3 ответов


у вас есть несколько возможностей:

В Игре 2.3, библиотека WS теперь является отдельной библиотекой, так что должно помочь. RC2 является уже существующих

кроме того, вы можете зависеть от игры 2.x и используйте StaticApplication вот так:

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

это по существу загрузит приложение Play, и оттуда вы можете использовать WS библиотека как обычно


Я принял ответ Мануэля Бернхардта, потому что он привел меня в правильном направлении, но я чувствую, что полный пример важен для любого другого с этой проблемой.

я обновил сборку.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 требует использования неявного приложения 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!

Я не знаю других библиотек Scala, которые реализуют клиент отправленных событий сервера, но проект Джерси имеет Java библиотека для сервера отправленных событий клиентов (как и серверы). API не кажется очень подробным и, похоже, его можно красиво завернуть в какой-то код, чтобы он более идиоматично вписывался в Scala.