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.