2013-04-03 50 views
0

由於一些遺留的要求,我們需要一個開放的TCP套接字保持遺留系統和與之異步交換一些信息。我們有一個Web應用程序接收來自Web的請求,目前是一個獨立的Java應用程序,其中包含傳統通信的Netty。如何在webapp中使用netty進行永久TCP遠程連接?

我們現在想以某種方式嵌入了Netty直接進入Web應用程序包,這樣,當Web應用程序運行,並且使Web應用程序(或EJB),並與網狀通道等

你互動插座啓動有一個想法如何做到這一點?

因此,我希望完成的是拋棄JMS隊列,我們​​現在正在使用這些隊列將功能的netty/legacy部分與面向web的功能集成在一起,換句話說,我希望顯着簡化體系結構,以便只有webapp +使用EJB,但不使用JMS。

回答

1

假設你運行的Servlet容器沒有SecurityManager配置,你可以啓動一個應用程序的Netty作爲Web應用程序的一部分。

首先,寫一個ServletContextListener實現的時候你的web應用程序啓動或Servlet容器停止的通知。你可以在那裏啓動和停止你的Netty應用程序。你也可能應該更新web.xml,以便Servlet容器提取它。

爲了讓Netty的應用程序與Web應用程序進行交互(例如,通過應用程序的Netty將消息發送到遺留系統),你有你的Netty應用程序公開到Web應用程序。這通常是通過一個單例完成的。

因爲Netty中每一個操作是異步的,你可能會遇到你的Web應用程序和應用程序的Netty之間的一些「阻抗失配」。通常,Web應用程序會要求Netty應用程序向舊系統發送請求,並等待Netty應用程序通知從遺留系統收到響應時。

要處理這種情況,通常可以使用數據結構(如BlockingQueue) - 在發送請求後,Web應用程序會等待,直到隊列中有一個元素,Netty應用程序會將響應對象添加到隊列中通知Web應用程序。

如果使用了Netty 4,你可能想看看io.netty.util.concurrent.Future/Promise類這也是這種情況是非常有效了。

+0

嗨,Trustin。我如何解決傳統系統與異步系統的通信問題?即收到Web請求後,我需要返回一個同步響應 - >但在此期間,netty(按照上面的建議部署)必須聯繫舊服務器並接收我可以在servlet中讀取的響應。我需要在servlet中查詢結果嗎? – bozo

+0

答覆已更新。 :-) – trustin