[英]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實現擴展應用程序的唯一方法。
一些選擇:
實現連接器(JCA)的例子如下: http : //www.theserverside.com/tt/articles/article.tss? l = J2EE1_4可能是現有客戶端的最佳方式。
使用Java消息隊列
這里討論了這種技術之間的關系http://java.sun.com/products/jms/faq.html#relship_ejbs
寫入在數據庫中存儲請求的服務器。(沒有Tx支持)
如果你只有一台服務器並且它看起來太多,你可以忽略這些方面並遵循Vinegars的建議。 但如果您需要Tx以后或其他節點,則必須重新設計此部件。
你也不應該訪問文件:(
這是在規范中,因為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.