2011-09-28 78 views
17

閱讀RESTful文檔,它似乎不可能實現一個異步實例,但有人可能會更好地瞭解SO。是否可以使用異步RESTful Web服務?

我的意思是在這裏我想異步執行的服務請求:

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

我知道asyncSupported@Path定義,但是我正在尋找類似的東西@WebServlet。然後,我想使用AsyncContext實例(或任何等效的實例)。

這可能嗎?

+1

爲什麼不使用AJAX異步調用REST風格的方法? –

+0

@The由於實現了AsyncContext來解決Servlet中過多的每線程請求問題。使用Ajax調用RESTful不會解決這個問題(在服務器端)。這個想法/解決方案是在一組有限的線程上排隊處理請求(有點像Nginx)。 – JVerstry

+0

你可能想問一下http://java.net/projects/jersey/lists/users/archive列​​表。澤西島澤西隊前段時間對未來進行了實驗。不知道這是否演變。 –

回答

8

RestEasy對它有一些支持 - 使用一個名爲@Suspend的自定義註釋。

在這裏看到: http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html/Asynchronous_HTTP_Request_Processing.html

還有澤西頂部的框架/庫調用氣氛然而作爲其重點似乎是在長輪詢客戶機/服務器的Web應用程序,可能是矯枉過正的用例(例如聊天 - https://github.com/Atmosphere/atmosphere

[1]您的請求的CDI範圍將丟失在實際執行邏輯的線程中。有關更多信息,請參閱RESTEasy-682問題。這是目前我知道的任何REST框架尚未解決的問題[2014年3月]

2

它顯然可能與CXF and Jetty Continuations,但只有在Jetty 6纔有可能;他們已經在Jetty 7中更改爲Servlet 3.0規範中的內容,並且我不知道CXF是否支持它。此外,碼頭繼續似乎有點a messy API, with a lot of manual stuff,所以我不知道它是多麼容易轉換代碼。

儘管如此,似乎有點可能。隨着微風,當上帝願意它。

+0

(不,我從來沒有嘗試過。) –

2

穩定的分化還處於其生命的早期階段。但是這個問題應該被視爲2部分。客戶端和服務器。

客戶端:

對於客戶端來說,去年最近的變化已經足夠成熟了。最近,一個基於Jeanfrancois Arcand的非阻塞客戶端被實現並被推送到存儲庫。有一個解釋here

服務器:

對於服務器端來說,它還是不成熟。新servlet規範的採用非常緩慢,作爲開發人員,我期望JSR 339也可以解決這些問題。 JSR規範也清楚地說明了這些句子。

JAX-RS 1.1在服務器端 一側定義了同步請求響應模型。此JSR將指定一個簡單的異步請求處理 模型,以便響應可以異步返回到 請求。 Servlet 3。0可以用來啓用這種支持,但 實現可以選擇使用其他容器特定的API 代替。

但也有其他的選擇。像Jetty這樣的項目正在解決像example這樣優雅的問題。我只能建議你考慮其他的選擇,因爲社區正在成長。

1

查看Pubsubhubbub找到here,查看了一個基於REST的異步協議的示例。它基於Atom Syndication格式,比WS- * pub/sub機制簡單得多。

+0

這是一個Ruby解決方案,你有Java嗎? – JVerstry

+0

當我提到異步時,我的意思是服務器端的異步請求處理... – JVerstry

0

你也可以試試春天Webflux是異步和反應同一時間。但是,這不是Java EE中的JAX-RS實現。