2013-02-19 74 views
1

我正在尋找Java EE的全雙工流式傳輸解決方案。Java EE中的雙工流式傳輸

情況:客戶端應用程序(JavaFX)從外圍設備讀取數據。這些數據需要幾乎實時地傳輸到服務器進行處理,並且還可以異步地獲取響應,同時不斷髮送新數據進行處理。

與服務器的通信需要儘可能低的開銷。進入的數據基本上是一些傳感器數據,並且在處理之後它被轉換成可被描述爲一組命令的內容。

我已經看了什麼爲:

  1. TCP/IP服務器(這是一個非Java EE的做法)。這將是顯而易見的解決方案。從每個客戶端應用程序並行打開兩個連接:一個用於上游數據,另一個用於下游數據。
  2. 遠程&無狀態EJB。這意味着沒有流式傳輸,並且我將傳感器數據打包在較小的窗口中(傳感器數據爲1-2秒),然後發送到服務器進行處理並獲得處理結果作爲響應。對於這種方法,雖然它具有可擴展性,但我不確定考慮每隔1-2秒發出一次請求的速度有多快。我仍然需要測試這個,但我有我的疑惑。
  3. RMI。從技術上講,這與EJB有什麼不同?
  4. 兩個長查詢的servlet(向上/向下)。我以前沒有這樣做過,所以這是要測試的東西。

現在我想測試我的方法#2的性能。第一個解決方案肯定會起作用,但我不太喜歡有一個單獨的服務器(在Tomcat旁邊,我已經有一些東西在運行)。然而,與此同時,值得了解是否還有其他可以輕鬆解決這個問題的Java特定(EE或非)特定技術(EE或不)的技術。如果有人有想法,請分享。

回答

2

這看起來像使用JMS的好地方。您可能會使用Message-Driven Beans而不是無狀態的EJB。

這爲您提供了類似於第一種解決方案的方法,即使用兩個消息隊列而不是TCP/IP連接。 JMS使您的通信完全異步,並且開銷較低,因爲您的客戶可以儘可能快地發送消息,而不管服務器能夠使用它們的速度。您還可以獲得交付保證和其他JMS善意。

但是,Tomcat並未附帶JMS。您可以嘗試TomEE或將現有的Tomcat與JMS實現(如ActiveMQ)集成。

+0

是的,我將與ActiveMQ一起(至少對於測試)。我有時間研究它,另一方面的MDB也無濟於事,因爲我需要將處理後的消息返回給發件人。但是我發現ActiveMQ支持消息轉換。基本上,我可以在經紀人傳遞給消費者之前處理消息。 – 2013-02-20 21:03:53

0

你看過websockets作爲解決方案嗎?他們被稱爲保持持久連接,因此異步響應將會很快。

+0

感謝您的回答,但客戶端不是Web瀏覽器,而是JavaFX應用程序。我會更新我的問題。 – 2013-02-20 06:24:42

+0

websockets並不特定於瀏覽器。只要你可以使用websocket客戶端庫,你應該可以使用它。我不太瞭解JavaFX ...但是,一個快速谷歌似乎表明,你可以使用javafx websockets。 http://yoshio3.com/2012/12/22/javaee7-websocket-client-sample-with-javafx/ – chitakasa 2013-02-20 06:29:12

1

有很多選擇,你可以嘗試。適當的解決方案取決於應用程序的性質,通信協議,數據傳輸類型,客戶端和服務器上的控制以及客戶端服務器路由上的防火牆限制。

在你的問題中沒有太多關於這方面的信息,但考慮到你提供了什麼,你可能喜歡看netty,因爲它是相當普遍的目的和靈活性,似乎符合你的要求。Netty還包括一個雙工websocket實現。請注意,基於netty的解決方案可能比其他解決方案(如jms)更復雜,需要更多的背景研究。

GraniteDS中的另一個可能的解決方案,它通告了JavaFX客戶端集成和多個服務器集成以實現全雙工客戶端/服務器通信,儘管我沒有使用它。 GraniteDS針對Flex/Flash可能熟悉的數據使用彗星(具有長輪詢模型的兩個異步servlet)和Active Message Format。

+0

謝謝!不幸的是我受到一些限制,我不能使用**任何**技術(儘管我會很高興,因爲它無論如何都是新事物)。希望你明白我的意思。 Netty似乎並不普遍。我想我會給ActiveMQ一個機會。 – 2013-02-20 21:00:26

+0

總是最好在你的問題中包含任何約束條件。 – jewelsea 2013-02-20 21:09:34