2012-03-12 28 views
7

Tôi đã sử dụng thư viện Databinder Dispatch trong một máy khách cho một API REST-ish đơn giản. Tôi biết làm thế nào để phát hiện nếu tôi nhận được một phản ứng HTTP với một trạng thái lỗi:Thư viện Scala Dispatch: cách xử lý lỗi kết nối hoặc hết giờ?

Http x (request) { 
    case (200, _, _, content) => successResult(content()) 
    case (404, _, _, _) => notFoundErrorResult 
    case (_, _, _, _) => genericErrorResult 
} 

Nhưng làm thế nào tôi có thể phân biệt được một phản ứng lỗi từ một thất bại để có được bất kỳ phản ứng nào cả, vì một miền không hợp lệ hoặc không kết nối ? Và có cách nào để thực hiện một thời gian chờ trong khi vẫn sử dụng ngữ nghĩa đồng bộ? Nếu có bất cứ điều gì có liên quan trong API, tôi đã bỏ lỡ nó.

Trả lời

4

Periodic Table cho chúng tôi biết rằng >! thiết lập trình xử lý ngoại lệ và chuỗi danh sách gửi thư gần đây giải thích how to set a timeout.

Tất cả lại với nhau, sau đó, bạn có thể làm điều gì đó như:

val http = new dispatch.Http { 
    import org.apache.http.params.CoreConnectionPNames 
    client.getParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000) 
    client.getParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000) 
} 
http(req >! { 
    case e => // ... 
}) 

Lưu ý rằng tôi đã không kiểm tra này ...

+0

Cảm ơn ... nhưng tôi không nghĩ rằng ExceptionListener làm những gì tôi muốn . Tôi muốn làm cho yêu cầu HTTP trả về một số giá trị X nếu nó có ngoại lệ E. Có vẻ như ExceptionListener không trả về bất kỳ thứ gì - nó được định nghĩa là Catcher [Unit]. Nó chỉ được gọi và sau đó Http trả lại ngoại lệ. Vì vậy, tôi nghĩ rằng tôi cần phải làm một thử/nắm bắt sau khi tất cả, đó là những gì tôi muốn tránh. –

3

Trong trường hợp bạn đang sử dụng văn khởi động lại (với AsyncHttpClient như tiềm ẩn thư viện) đây là cách bạn muốn thiết lập các cấu hình máy khách:

val myHttp = new dispatch.Http { 
    import com.ning.http.client._ 
    val builder = new AsyncHttpClientConfig.Builder() 
    builder.setCompressionEnabled(true) 
    .setAllowPoolingConnection(true) 
    .setRequestTimeoutInMs(5000) 
    override lazy val client = new AsyncHttpClient(builder.build()) 
} 

và sau đó chỉ cần sử dụng đối tượng mới này như bạn muốn nếu không sử dụng http:

myHttp((url(baseUrl) <<? args) OK as.xml.Elem).either 
+0

kích thước hồ bơi kết nối tối đa cũng cần được xác định ở đây và cách xác định kích thước hàng đợi động và kích thước hàng đợi tối đa? – akshaymani

15

Ngoài ra còn có một cách thanh lịch hơn để cấu hình khách hàng sử dụng Http.configure phương pháp mà nhận Builder => Builder chức năng như một cuộc tranh cãi:

val http = Http.configure(_.setAllowPoolingConnection(true).setConnectionTimeoutInMs(5000)) 
+0

Người ta có thể muốn sử dụng setRequestTimeoutInMs ngoài setConnectionTimeoutInMs, vì chúng bổ sung cho nhau một cách độc đáo. – h7r

Các vấn đề liên quan