0

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

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

你知道怎么做吗?

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

4

1 回答 1

1

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

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

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

因为 Netty 中的每个操作都是异步的,所以您可能会在 Web 应用程序和 Netty 应用程序之间遇到一些“阻抗不匹配”。通常,Web 应用程序会要求 Netty 应用程序向遗留系统发送请求,并等待 Netty 应用程序在收到来自遗留系统的响应时发出通知。

为了处理这种场景,通常可以使用这样的数据结构BlockingQueue——发送请求后,Web 应用程序会一直等待,直到队列有元素,Netty 应用程序会将响应对象添加到队列中以通知 Web 应用程序。

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

于 2013-04-04T08:02:48.580 回答