如何在webapp中使用netty进行永久TCP远程连接?

时间:2013-04-03 13:00:38

标签: netty ejb-3.1

由于一些遗留要求,我们需要为旧系统保留一个开放的TCP套接字,并异步地与它交换一些消息。我们有一个webapp接收来自Web的请求,目前是一个单独的Java应用程序,其中包括进行传统通信的Netty。

我们现在想以某种方式将Netty直接嵌入到webapp包中,以便在webapp运行时启动套接字,以便webapp(或EJB)与netty Channels等交互。

你知道怎么做吗?

所以我希望完成的是抛弃我们现在正在使用的JMS队列,用于将netty / legacy部分功能与面向Web的功能集成,换句话说,我希望显着简化架构,以便只有webapp +使用EJB,但不使用JMS。

1 个答案:

答案 0 :(得分:1)

假设您运行的Servlet容器未配置SecurityManager,您可以将Netty应用程序作为Web应用程序的一部分启动。

首先,编写一个ServletContextListener实现,该实现在Servlet容器启动或停止Web应用程序时得到通知。您可以在那里启动和停止您的Netty应用程序。您还应该更新web.xml,以便Servlet容器选择它。

要使Netty应用程序与您的Web应用程序交互(例如,通过Netty应用程序向遗留系统发送消息),您必须将Netty应用程序公开给Web应用程序。这通常是通过单身人士完成的。

由于Netty中的每个操作都是异步的,因此您的Web应用程序和Netty应用程序之间可能会遇到“阻抗不匹配”。通常,Web应用程序将要求Netty应用程序向遗留系统发送请求,并等待Netty应用程序通知何时从遗留系统收到响应。

要处理这种情况,您通常可以使用数据结构,例如BlockingQueue - 在发送请求后,Web应用程序会等待队列中有一个元素,Netty应用程序会将响应对象添加到用于通知Web应用程序的队列。

如果您使用的是Netty 4,您可能需要查看io.netty.util.concurrent.Future/Promise类,这些类对于这种情况也是非常有用的构造。