Scala: получение отправленных сервером событий

Настроить:

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

curl -X GET server:port/topics/news

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

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

Проблема:

У меня есть проект Scala, который должен подписаться на этот паб / суб-сервер. Игра! Framework может справиться с этим, используя PlayWS с Enumeratee + Iteratee. К сожалению, библиотека PlayWS требует, чтобы Play! Приложение находится в области, и я не использую Play. Есть ли библиотека (с минимальными зависимостями), которую я могу использовать, которая позволяет мне принимать события, отправленные сервером? Мне понадобится хотя бы один рабочий пример, чтобы начать.

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

3 ответа

Решение

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

В Play 2.3 библиотека WS теперь является отдельной библиотекой, так что это должно помочь. RC2 уже доступен

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

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

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

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

Я обновил свой файл 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!"

Приложение My Scala напечатает полученное событие

data: Politician Lies!

Мне неизвестны другие библиотеки Scala, в которых реализован клиент Server Sent Events, но в проекте Jersey есть библиотека Java для клиентов Server Sent Events (а также серверов). API не выглядит слишком многословным, и кажется, что он может быть красиво обернут в некоторый код, чтобы более идиоматически вписываться в Scala.

Другие вопросы по тегам