1

我正在寻找一个带有 Java EE 的全双工流解决方案。

情况:客户端应用程序 (JavaFX) 从外围设备读取数据。这些数据需要近乎实时地传输到服务器进行处理,并且还需要异步返回响应,同时不断发送新数据进行处理。

与服务器的通信需要有尽可能低的开销。传入的数据基本上是一些传感器数据,经过处理后,它们被转入可以描述为一组命令的内容。

我调查的内容:

  1. TCP/IP 服务器(这是一种非 Java EE 方法)。这将是显而易见的解决方案。从每个客户端应用程序并行打开两个连接:一个用于上游数据,一个用于下游数据。
  2. 远程和无状态 EJB。这意味着不涉及流式传输,并且我将传感器数据打包在较小的窗口中(价值 1-2 秒的传感器数据),然后我将其发送到服务器进行处理并获取处理结果作为响应。对于这种方法,虽然它是可扩展的,但考虑到我必须每 1-2 秒发出一个请求,我不确定它的速度有多快。我仍然需要对此进行测试,但我对此表示怀疑。
  3. RMI。从技术上讲,这与 EJB 有什么不同吗?
  4. 两个带有长轮询的 servlet(上/下)。我以前没有这样做过,所以有待测试。

现在我想测试我的方法 #2 的性能。第一个解决方案肯定会起作用,但我不太喜欢拥有一个单独的服务器(在 Tomcat 旁边,我已经在其中运行了一些东西)。

但是,与此同时,值得了解是否有任何其他 Java 特定(EE 或非 EE)技术可以轻松解决这个问题。如果有人有想法,请分享。

4

3 回答 3

2

这看起来是使用JMS的好地方。您可能会使用消息驱动 Bean ,而不是无状态 EJB 。

这为您提供了一种类似于您的第一个解决方案的方法,使用两个消息队列而不是 TCP/IP 连接。JMS 使您的通信完全异步并且开销很低,因为无论您的服务器可以多快地使用它们,您的客户端都可以尽可能快地发送消息。您还可以获得交付保证和其他 JMS 优点。

然而,Tomcat 不附带 JMS。您可以尝试使用 TomEE或将现有的 Tomcat 与ActiveMQ等 JMS 实现集成。

于 2013-02-20T06:49:45.880 回答
1

您可以尝试多种选择。适当的解决方案取决于您的应用程序的性质、通信协议、数据传输类型、您对客户端和服务器的控制以及对客户端服务器路由的防火墙限制。

您的问题中没有太多关于此的信息,但鉴于您提供的内容,您可能希望查看netty,因为它非常通用且灵活,并且似乎符合您的要求。Netty 还包括一个双工 websocket 实现。请注意,与其他一些解决方案(例如 jms)相比,基于 netty 的解决方案实施起来可能更复杂,并且需要更多的背景研究。

GraniteDS中的另一种可能的解决方案,它宣传 JavaFX 客户端集成和多服务器集成以实现全双工客户端/服务器通信,尽管我没有使用它。GraniteDS 使用 Comet(您的两个具有长轮询模型的异步 servlet)和 Active Message Format 来处理您可能熟悉的来自 Flex/Flash 的数据。

于 2013-02-20T07:05:30.843 回答
0

您是否将 websockets 视为解决方案?众所周知,它们会保持持久连接,因此异步响应会很快。

于 2013-02-20T06:21:21.937 回答