簡體   English   中英

如何從Java EE應用程序提供套接字?

[英]How to serve a socket from a Java EE application?

我們希望在Java EE應用服務器(JBoss 4.2.3)中提供一些客戶端請求。 我讀到Java EE規范不允許從企業bean打開套接字 但該規范表明沒有其他選擇。

具體來說,企業bean不應該:

  • 監聽,接受網絡套接字上的連接或多播

所以問題是:我可以做什么來從應用服務器中提供一些基於二進制 tcp的協議(而不是http)?

這里有人建議實現資源適配器 這是你必須去的方式還是其他(更容易)的解決方案?

您是對的,因為您可以為Java EE中的每個事物聲明事務,所以必須從您要連接的所有組件支持它們。 文件(如果有)應存儲在數據庫中。 一切都應該由容器控制,因為它是使用Java EE實現擴展應用程序的唯一方法。

一些選擇:

你也不應該訪問文件:(

這是在規范中,因為EJB必須是:

  • distributable(您事先不知道將部署EJB的服務器/實例)
  • 容器是能夠管理“一切”所以你不能產生自己的線程

記住,沒有什么會阻止你在你的應用程序中啟動服務器套接字(最好的位置可能是在servlet中)但你應該注意當你的應用程序關閉時serversocket如何關閉...

現在我實現了一個解決方法:

alt text http://yuml.me/7f82bd5c

我使用一個獨立的java應用程序,它接受來自客戶端的tcp調用,並將它們作為JNDI調用轉發給應用程序服務器。

根據我在Spring MVC中的需要,我使用了一些類似的解決方案。 可能這可以幫助這里的人。

在服務器啟動時啟動套接字端口。 我使用了@scheduler注釋,你也可以使用基於監聽器的解決方案。 您還可以實現ApplicationContextAware偵聽器,並可以從中訪問其他應用程序bean。

 @Scheduled(fixedDelay = 1000 * 60 * 60 * 24 * 365) public void startListenerPort() { ServerSocket socket = new ServerSocket(9999); // do some stuff here } 

只需確保您已在分配給套接字的端口(防火牆設置)上允許TCP流量。

通過這種方式,您可以在端口9999上擁有TCP流量,因為您的應用服務器將繼續在不同的端口上正常運行。

雖然不是嚴格意義上的純TCP連接,但您可以通過@ServerEndpoint注釋來實現所需,從Java EE7規范創建WebSocket。

雖然這個DOES使用HTTP,但當你的@OnMessage方法和ByteBuffer (或byte[] )作為參數時,它的功能有點像二進制接口。

暫無
暫無

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

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