我们希望在Java EE应用服务器(JBoss 4.2.3)中提供一些客户端请求。我读到Java EE spec doesn't allow opening a socket from an enterprise bean。但规范没有其他选择。
具体来说,企业bean不应该:
- 通过网络套接字侦听,接受连接或从网络套接字多播
所以问题是:我可以做些什么来从应用服务器中提供一些二进制基于tcp的协议(而不是http)?
Here有人建议实施resource adapter。这是你必须去的方式还是其他(更容易)的解决方案?
答案 0 :(得分:7)
你是对的,因为你可以为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以后或其他节点 这部分必须重新设计。
答案 1 :(得分:2)
您也不应该访问文件:(
这是在规范中,因为EJB必须是:
请记住,没有什么会阻止你在应用程序中启动服务器套接字(最好的位置可能是在servlet中)但你应该注意当你的应用程序出现故障时关闭serversocket的方式......
答案 2 :(得分:1)
现在我实施了一个解决方法:
alt text http://yuml.me/7f82bd5c
我使用一个独立的java应用程序,它接受来自客户端的tcp调用,并将它们作为JNDI调用转发给应用程序服务器。
答案 3 :(得分:0)
根据我在Spring MVC中的需要,我使用了一些类似的解决方案。可能这可以帮助周围的人。
在服务器启动时启动套接字端口。我使用了@scheduler注释,你也可以使用基于监听器的解决方案。您还可以实现ApplicationContextAware侦听器,并可以从中访问其他应用程序bean。
@Scheduled(fixedDelay = 1000 * 60 * 60 * 24 * 365)
public void startListenerPort() {
ServerSocket socket = new ServerSocket(9999);
// do some stuff here
}
@Scheduled(fixedDelay = 1000 * 60 * 60 * 24 * 365)
public void startListenerPort() {
ServerSocket socket = new ServerSocket(9999);
// do some stuff here
}
只需确保您已在分配给套接字的端口(防火墙设置)上允许TCP流量。
通过这种方式,您可以在端口9999上拥有TCP流量,因为您的应用服务器将继续在不同的端口上正常运行。
答案 4 :(得分:0)
虽然不是严格意义上的纯TCP连接,但您可以使用@ServerEndpoint
注释从Java EE7规范创建WebSocket,从而实现所需。
虽然这个DOES使用HTTP,但当你的@OnMessage
方法和ByteBuffer
(或byte[]
)作为参数时,它的功能有点像二进制接口。