2013-02-19 93 views
1

我正在寻找Java EE的全双工流式传输解决方案。Java EE中的双工流式传输

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

与服务器的通信需要尽可能低的开销。进入的数据基本上是一些传感器数据,并且在处理之后它被转换成可被描述为一组命令的内容。

我已经看了什么为:

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

现在我想测试我的方法#2的性能。第一个解决方案肯定会起作用,但我不太喜欢有一个单独的服务器(在Tomcat旁边,我已经有一些东西在运行)。然而,与此同时,值得了解是否还有其他可以轻松解决这个问题的Java特定(EE或非)特定技术(EE或不)的技术。如果有人有想法,请分享。

回答

2

这看起来像使用JMS的好地方。您可能会使用Message-Driven Beans而不是无状态的EJB。

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

但是,Tomcat并未附带JMS。您可以尝试TomEE或将现有的Tomcat与JMS实现(如ActiveMQ)集成。

+0

是的,我将与ActiveMQ一起(至少对于测试)。我有时间研究它,另一方面的MDB也无济于事,因为我需要将处理后的消息返回给发件人。但是我发现ActiveMQ支持消息转换。基本上,我可以在经纪人传递给消费者之前处理消息。 – 2013-02-20 21:03:53

0

你看过websockets作为解决方案吗?他们被称为保持持久连接,因此异步响应将会很快。

+0

感谢您的回答,但客户端不是Web浏览器,而是JavaFX应用程序。我会更新我的问题。 – 2013-02-20 06:24:42

+0

websockets并不特定于浏览器。只要你可以使用websocket客户端库,你应该可以使用它。我不太了解JavaFX ...但是,一个快速谷歌似乎表明,你可以使用javafx websockets。 http://yoshio3.com/2012/12/22/javaee7-websocket-client-sample-with-javafx/ – chitakasa 2013-02-20 06:29:12

1

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

在你的问题中没有太多关于这方面的信息,但考虑到你提供了什么,你可能喜欢看netty,因为它是相当普遍的目的和灵活性,似乎符合你的要求。Netty还包括一个双工websocket实现。请注意,基于netty的解决方案可能比其他解决方案(如jms)更复杂,需要更多的背景研究。

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

+0

谢谢!不幸的是我受到一些限制,我不能使用**任何**技术(尽管我会很高兴,因为它无论如何都是新事物)。希望你明白我的意思。 Netty似乎并不普遍。我想我会给ActiveMQ一个机会。 – 2013-02-20 21:00:26

+0

总是最好在你的问题中包含任何约束条件。 – jewelsea 2013-02-20 21:09:34