如何从Java EE应用程序提供套接字?

时间:2010-01-14 10:13:52

标签: java sockets java-ee jboss

我们希望在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。这是你必须去的方式还是其他(更容易)的解决方案?

5 个答案:

答案 0 :(得分:7)

你是对的,因为你可以为Java EE中的每件事物声明事务,所以你想要连接的所有组件都必须支持它们。文件(如果有)应存储在数据库中。一切都应该由容器控制,因为它是使用Java EE实现扩展应用程序的唯一方法。

一些选择:

答案 1 :(得分:2)

您也不应该访问文件:(

这是在规范中,因为EJB必须是:

  • distributable(您事先不知道将部署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[])作为参数时,它的功能有点像二进制接口。