簡體   English   中英

Java EE中的雙工流

[英]Duplex streaming in 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或非)技術可以輕松解決這個問題。 如果有人有想法,請分享。

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

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

但是,Tomcat沒有附帶JMS。 您可以嘗試使用TomEE或將現有的Tomcat與ActiveMQ等JMS實現集成。

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

在您的問題中沒有太多關於此的信息,但鑒於您提供的內容,您可能希望看看netty,因為它非常通用且靈活,似乎符合您的要求。 Netty還包括雙工websocket實現。 請注意,基於netty的解決方案實現起來可能更復雜,並且需要比其他一些解決方案(例如jms)更多的背景研究。

GraniteDS中的另一個可能的解決方案,它宣傳JavaFX客戶端集成和多服務器集成以進行全雙工客戶端/服務器通信,盡管我還沒有使用它。 GraniteDS使用Comet(您的兩個具有長輪詢模型的異步servlet)和您可能熟悉的Flex / Flash數據的Active Message Format。

你看過websockets作為解決方案嗎? 眾所周知,它們會保持持久連接,因此異步響應會很快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM