2014-05-16 11 views
8

Set-up:Scala: Nhận Server-Sent-Sự kiện

Một dự án tôi đang làm việc trên có một quán rượu/phụ máy chủ với một giao diện HTTP. Đăng ký hoạt động bằng cách chấp nhận các sự kiện do máy chủ gửi.

curl -X GET server:port/topics/news 

đó sẽ được đẩy bất cứ khi nào một thông điệp được công bố vào trao URL chủ đề

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

Vấn đề:

tôi có một dự án scala mà cần phải đăng ký vào quán rượu này/sub máy chủ. Vở kịch! framework có thể xử lý điều này bằng cách sử dụng PlayWS với Enumeratee + Iteratee. Thật không may, thư viện PlayWS yêu cầu Play! Ứng dụng nằm trong phạm vi và tôi không sử dụng Play. Có một thư viện (với sự phụ thuộc tối thiểu) tôi có thể sử dụng cho phép tôi chấp nhận các sự kiện gửi-máy chủ? Tôi sẽ cần ít nhất một ví dụ làm việc để bắt đầu.

Tôi có sở thích cho thư viện scala nhưng tôi sẵn sàng chấp nhận giải pháp Java nếu tôi phải làm như vậy.

Trả lời

3

Bạn có một số khả năng:

Khi chơi 2.3, the WS library is now a separate library, do đó sẽ hữu ích. RC2 đã có sẵn

Ngoài ra, bạn có thể phụ thuộc vào Chơi 2.x và sử dụng một StaticApplication như vậy:

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

này về cơ bản sẽ bootstrap một ứng dụng Play, và từ đó về bạn có thể sử dụng thư viện WS như thường lệ

+0

Điều này có vẻ đầy hứa hẹn. Tôi gặp sự cố khi sử dụng thư viện PlayWS 2.2 trước khi tạo câu hỏi này. Bạn có thể tạo một ví dụ độc lập về việc sử dụng PlayWS để chấp nhận SSE không? –

2

Tôi không biết các thư viện Scala khác triển khai máy khách Sự kiện đã gửi máy chủ, nhưng dự án Jersey có Java library for Server Sent Events clients (cũng như máy chủ). API dường như không tiết lộ, và có vẻ như nó có thể được gói gọn trong một số mã để phù hợp hơn với Scala.

+0

tôi khám phá tùy chọn này trước khi đưa ra câu hỏi này. Nó sẽ yêu cầu tôi viết một wrapper nhưng chi phí sẽ nhỏ. +1 nhưng tôi vẫn giữ nguyên lựa chọn Scala –

+0

Vấn đề với tạo phẩm 'javax.ws.rs-api' trong SBT dường như chặn việc sử dụng điều này, tại thời điểm này: https://github.com/gradle/gradle/issues/3065 –

4

Tôi đã chấp nhận câu trả lời của Manuel Bernhardt vì nó dẫn tôi đi đúng hướng nhưng tôi cảm thấy một ví dụ đầy đủ là quan trọng đối với bất kỳ ai khác về vấn đề này.

Tôi đã cập nhật tệp build.sbt của mình để bao gồm PlayWS 2.3 và thư viện Iteratees.

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

WS singleton đòi hỏi một vai Application ngầm sẽ được sử dụng (một cái gì đó tôi không có hoặc muốn) để thay vào đó tôi sẽ cần phải tạo ra khách hàng của riêng tôi

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

sau đó tôi có thể tạo Iteratee của tôi để tôi có thể xử lý các sự kiện do máy chủ gửi của mình.

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

và cuối cùng đăng ký với máy chủ

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

Bây giờ, khi một sự kiện được gửi

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

ứng dụng Scala của tôi sẽ in các sự kiện nhận

data: Politician Lies! 
Các vấn đề liên quan