[英]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.