2011-09-28 46 views
17

Đọc tài liệu RESTful, có vẻ như không thể thực hiện một trường hợp không đồng bộ, nhưng ai đó có thể biết rõ hơn về SO.Dịch vụ web RESTful không đồng bộ có thể không?

Những gì tôi có ý nghĩa ở đây là tôi muốn thực hiện yêu cầu dịch vụ không đồng bộ:

@Path("/helloworld", asyncSupported=true) 
public class MyHelloWorldService { 
    ... 
} 

Tôi biết asyncSupported không được định nghĩa trong @Path, nhưng tôi đang tìm kiếm một cái gì đó tương tự như @WebServlet. Sau đó, tôi muốn sử dụng các trường hợp AsyncContext (hoặc bất kỳ thứ gì tương đương).

Điều này có khả thi không?

+1

Tại sao không sử dụng AJAX để gọi phương thức RESTful của bạn không đồng bộ? –

+0

@The Vì AsyncContext được triển khai để giải quyết vấn đề quá nhiều yêu cầu cho mỗi yêu cầu trong Servlet. Sử dụng Ajax để gọi RESTful sẽ không giải quyết vấn đề này (ở phía máy chủ). Ý tưởng/giải pháp là xếp hàng các yêu cầu xử lý trên một tập hợp các chuỗi có giới hạn (giống như Nginx). – JVerstry

+0

Bạn có thể muốn hỏi về danh sách http://java.net/projects/jersey/lists/users/archive. IIRC Jersey đã thử nghiệm với tương lai một thời gian trước đây. Không chắc liệu điều đó có tiến triển hay không. –

Trả lời

8

RestEasy có một số hỗ trợ cho nó - sử dụng chú thích tùy chỉnh được gọi là @Suspend.

Xem ở đây: http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html

Ngoài ra còn có một khuôn khổ/thư viện trên đầu trang của Jersey gọi Atmosphere tuy nhiên đó có thể là quá mức cần thiết cho usecase của bạn như là trọng tâm của nó dường như là về dài thăm dò ứng dụng client/server web (ví dụ: cuộc trò chuyện - https://github.com/Atmosphere/atmosphere)

[1] Phạm vi CDI cho yêu cầu của bạn sẽ bị mất trong chuỗi thực sự thực thi logic. Xem sự cố RESTEasy-682 để biết thêm thông tin. Đây là vấn đề chưa được giải quyết bởi bất kỳ khung công tác REST nào mà tôi biết tại thời điểm này [tháng 3 năm 2014].

2

Có thể hiển thị với CXF and Jetty Continuations nhưng dường như chỉ có thể có với Cầu tàu 6; chúng đã được thay đổi trong Jetty 7 thành một cái gì đó có trong đặc tả Servlet 3.0 và tôi không biết liệu nó có được hỗ trợ bởi CXF hay không. Hơn nữa, Jetty Continuations dường như là một chút của a messy API, with a lot of manual stuff vì vậy tôi không biết cách dễ dàng để chuyển đổi mã.

Dường như có vẻ như có thể. Với một làn gió sau và khi Đức Chúa Trời muốn nó.

+0

(Và không, tôi chưa bao giờ thử nó.) –

2

Việc khôi phục sự yên tĩnh vẫn còn ở giai đoạn đầu của cuộc đời. Nhưng vấn đề này nên được coi là 2 phần. Khách hàng và máy chủ.

Khách hàng:

Đối với các thay đổi gần đây của khách hàng vào năm ngoái đã đủ trưởng thành. Và gần đây, một khách hàng không chặn từ dựa trên Jeanfrancois Arcand đã được triển khai và được đẩy vào kho lưu trữ. Có một lời giải thích here.

Máy chủ:

Đối với phía máy chủ, nó vẫn còn chưa trưởng thành. Việc chấp nhận đặc tả servlet mới khá chậm và là một nhà phát triển mà tôi mong đợi JSR 339 để giải quyết các vấn đề này. Và điều này cũng được giải quyết rõ ràng ở thông số JSR với những câu này.

JAX-RS 1.1 xác định mô hình phản hồi yêu cầu đồng bộ trên máy chủ . JSR này sẽ chỉ định một yêu cầu xử lý yêu cầu không đồng bộ đơn giản mô hình sao cho đáp ứng có thể được trả về không đồng bộ với yêu cầu . Servlet 3.0 có thể được tận dụng để bật hỗ trợ như vậy nhưng triển khai có thể chọn sử dụng các API dành riêng cho vùng chứa khác thay thế.

Tuy nhiên cũng có các lựa chọn thay thế khác. Các dự án như Jetty đang giải quyết các vấn đề như vậy thanh lịch như trong số example này. Tôi chỉ có thể đề nghị bạn xem xét các lựa chọn thay thế khác khi cộng đồng đang phát triển.

1

Kiểm tra Pubsubhubbub được tìm thấy here để biết ví dụ về giao thức không đồng bộ dựa trên REST. Nó dựa trên định dạng Atom Syndication và đơn giản hơn nhiều so với các cơ chế phụ/pub của WS- *.

+0

Đó là giải pháp Ruby, bạn có Java không? – JVerstry

+0

Khi tôi đề cập đến không đồng bộ, tôi có nghĩa là xử lý yêu cầu không đồng bộ ở phía máy chủ ... – JVerstry

0

Bạn cũng có thể muốn thử mùa xuân Webflux đó là async và phản ứng tại cùng lúc. Tuy nhiên, đây không phải là triển khai JAX-RS từ Java EE.

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