如何从JavaEE应用程序提供套接字服务?

如何从JavaEE应用程序提供套接字服务?,java,sockets,jakarta-ee,jboss,Java,Sockets,Jakarta Ee,Jboss,我们希望在JavaEE应用服务器(JBoss4.2.3)中提供一些客户端请求。我读了那本书。但该规范没有提出替代方案 具体来说,企业bean不应该: 从网络套接字侦听、接受连接或多播 因此,问题是:如何从应用服务器中为一些基于tcp的协议(而不是http)提供服务 有人建议实施一项新的计划。您必须这样做,还是有其他(更简单的)解决方案?您也不应该访问文件:( 这在规范中,因为EJB必须: 可分发(您事先不知道EJB将部署在哪个服务器/实例上) 容器能够管理“一切”,因此您不能生成自己的线程

我们希望在JavaEE应用服务器(JBoss4.2.3)中提供一些客户端请求。我读了那本书。但该规范没有提出替代方案

具体来说,企业bean不应该:

  • 从网络套接字侦听、接受连接或多播
因此,问题是:如何从应用服务器中为一些基于tcp的协议(而不是http)提供服务


有人建议实施一项新的计划。您必须这样做,还是有其他(更简单的)解决方案?

您也不应该访问文件:(

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

  • 可分发(您事先不知道EJB将部署在哪个服务器/实例上)
  • 容器能够管理“一切”,因此您不能生成自己的线程

请记住,没有任何东西会阻止您在应用程序中启动服务器套接字(最好的地方可能是在servlet中)但是你应该注意,当你的应用程序关闭时,serversocket是如何关闭的…

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

有几个选择:

  • 实现连接器(JCA)示例如下: 如果你有现有客户,这可能是最好的方法

  • 使用Java消息队列

  • 这里讨论了这两种技术之间的关系

  • 写入在数据库中存储请求的服务器。(不支持发送)

  • 如果您只有一台服务器,而且开销太大,那么您可以忽略这些 方面,并遵循Vinegars的建议。但如果您需要稍后发送或附加节点 这部分必须重新设计


现在,我实施了一个解决方案:


我使用一个独立的java应用程序,它接受来自客户端的tcp调用,并将它们作为JNDI调用转发到应用程序服务器。

根据我在Spring MVC中的需要,我使用了一些类似的解决方案。这可能对周围的人有所帮助

在服务器启动时启动套接字端口。我使用了@scheduler注释,而您也可以使用基于侦听器的解决方案。您还可以实现ApplicationContextAware侦听器,并可以从中访问其他应用程序bean。

只需确保在分配给套接字的端口上允许TCP通信(防火墙设置)


通过这种方式,您可以在端口9999上拥有TCP流量,在端口9999上,您的应用服务器将继续正常运行在不同的端口上。

虽然严格来说不是纯TCP连接,但您可以通过
@ServerEndpoint
注释从Java EE7规范创建WebSocket来实现所需的功能


尽管这确实使用HTTP,但当您的
@OnMessage
方法和
字节缓冲区
(或
字节[]
)作为参数时,它的功能有点像二进制接口。

Java命名和目录接口(JNDI)您通常会进行查找调用,您可以查找ejb并进行远程调用以处理从独立服务器接收的数据。链接不再可访问。请注意,此JCA示例适用于JCA 1.5,本文来自2003年。这涵盖了javaEE 6中包含的JCA 1.6,该版本不太喜欢XML:我正在尝试使用Singleto的beann和启动并通过消息序列化事件。@pgras指出“记住,没有任何东西会阻止您启动应用程序中的服务器套接字”后,听起来非常安全。@stuartw不……永远不要这样做。您直接违反了EJB3.0规范(第21.1.2节)中的规范:
企业bean不得尝试侦听套接字、接受套接字上的连接或使用套接字进行多播。
@Scheduled(fixedDelay = 1000 * 60 * 60 * 24 * 365) 
public void startListenerPort() { 
    ServerSocket socket = new ServerSocket(9999); 
    // do some stuff here 
}